Code First EF 4.1 MVC针对遗留数据库 - 多重性冲突

时间:2011-11-04 09:26:16

标签: c# asp.net-mvc-3 entity-framework ef-code-first

无论我混合哪种方式,都会给我带来错误。我有一种感觉,我错过了一些明显的东西,因为我不断收到这些错误。

  

在模型生成期间检测到一个或多个验证错误:

     

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

}

4 个答案:

答案 0 :(得分:140)

希望现在还能按时帮助你。我也遇到了完全相同的问题,并且在我发现错误之前一直困扰着它。

问题是Course.Venue关系是可选的(如在流畅的API上声明的那样),但Course.VenueId的Id声明是必需的,因此您可以通过将VenueId更改为

public int? VenueId { get; set;}

或者在fluent API上将关系更改为必需,并且一旦更改了OnModelCreating就可以正常运行。

答案 1 :(得分:4)

搜索网页后

System.Data.Edm.EdmAssociationType ::多重性与角色中的参照约束冲突

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

我使用vs ef逆向工程扩展将大型项目从ef4.0升级到ef4.1。我们的mvc应用程序使用metadatatype和partials来装饰ef4.0对象。

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

根问题是[必需]属性,因为ef poco对象具有可空性且我的元数据类型在同一属性上具有[必需]。以前是强制执行mvc验证规则,现在ef4.1用于填充导航属性。删除[required] off metadatatype修复了问题。

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; }
}

答案 2 :(得分:2)

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

答案 3 :(得分:2)

确保在映射中不要将HasKey()与HasOptional()结合使用。这导致了我的错误。