CodeFirst EF4.1 MVC对抗遗留数据库-多重冲突

本文关键字:数据库 冲突 EF4 MVC CodeFirst | 更新日期: 2023-09-27 18:13:35

无论我用哪种方式混合,它都会给我错误。当我不断得到这些错误时,我有一种感觉,我错过了一些明显的东西。

在模型生成过程中检测到一个或多个验证错误:

System.Data.Edm。EdmAssociationType::与关系Venue_Courses中角色"Venue_Courses_Source"中的引用约束冲突。因为从属角色中的所有属性都是非空的,所以主角色的多重性必须为"1"。

System.Data.Edm。EdmAssociationEnd::关系"Venue_Courses"中的角色"Venue_Courses_Target"的多重性无效。因为从属角色引用了关键属性,所以从属角色的多重性的上界必须是1。

一个课程只能有一个场地,场地可以供多个课程使用

public class Course
{
    [Key]
    public virtual int Id { get; set; }
    public string Title { get; set; }
    public DateTime StartDate { get; set; }
    public int VenueId { get; set; }
    
    public virtual Venue Venue { get; set; }
}
public class Venue
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    
    public virtual ICollection<Course> Courses { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    #region Courses
    //Table Alias
    modelBuilder.Entity<Course>().ToTable("DBSCHEMA.TR_COURSES");
    //Keys
    modelBuilder.Entity<Course>().HasKey(c => c.Id);
    //Joins
    //Join to Venues
    modelBuilder.Entity<Course>().HasOptional(c => c.Venue);
        
    //Fields
    modelBuilder.Entity<Course>().Property(c => c.Id).HasColumnName("COURSE_ID");
    modelBuilder.Entity<Course>().Property(c => c.Title).HasColumnName("CR_TITLE");
    modelBuilder.Entity<Course>().Property(c => c.StartDate).HasColumnName("START_DATE");
    modelBuilder.Entity<Course>().Property(c => c.VenueId).HasColumnName("VENUE_ID");
    #endregion

    #region Venues
    //Table Alias
    modelBuilder.Entity<Venue>().ToTable("DBSCHEMA.VENUES");
    //Keys
    modelBuilder.Entity<Venue>().HasKey(v => v.Id);
    //Joins
    modelBuilder.Entity<Venue>().HasMany(venue => venue.Courses);
    //Fields
    modelBuilder.Entity<Venue>().Property(v => v.Id).HasColumnName("VENUE_ID");
    modelBuilder.Entity<Venue>().Property(v => v.Name).HasColumnName("VENUE_NAME");
    #endregion
            
}

CodeFirst EF4.1 MVC对抗遗留数据库-多重冲突

希望这篇文章还能准时帮到你。我也遇到了完全相同的问题,并且困扰了将近一个小时,直到我发现了我的错误。

问题是Course.Venue关系是可选的(如在fluent API上声明的那样),但Course.VenueId的Id声明是强制性的,因此您可以通过将其更改为

来使VenueId成为可选的
public int? VenueId { get; set;}

或将关系更改为fluent API上的强制关系,一旦更改,OnModelCreating应该可以正常运行。

在网上搜索

System.Data.Edm。EdmAssociationType::与Role

中的引用约束冲突

我一直在写这篇文章,所以这里是我的问题和解决方案:

我使用vsef逆向工程扩展将一个大型项目从ef4.0升级到ef4.1。我们的mvc应用程序使用元数据类型和局部来修饰ef4.0对象。

删除元数据类型的文件后,项目开始工作。

根源问题是[Required]属性,因为ef poco对象具有空值,而我的元数据类型在同一属性上具有[Required]。以前是为了执行mvc验证规则,现在ef4.1被用来填充导航属性。删除[Required]元数据类型修复了这个问题。

public partial class AgentAgency
{
    public long OID { get; set; }
    public long? AgentOID { get; set; }
    public long? AgencyOID { get; set; }
    public string ReinsuranceYear { get; set; }
    public virtual Agency Agency { get; set; }
    public virtual Agent Agent { get; set; }
}
public class AgentAgencyMetadata
{
    public Int64 OID { get; set; }
    [Required]
    public Int64 AgentOID { get; set; }
    [Required]
    public Int64 AgencyOID { get; set; }
}

我在我的实体框架项目中遇到了这个错误,我通过改变VenueId的可空值来解决这个问题。

确保在映射中不要将HasKey()与HasOptional()结合使用。