【问题标题】:CodeFirst EF4.1 MVC Against legacy database - Multiplicity conflictsCodeFirst EF4.1 MVC 针对遗留数据库 - 多重冲突
【发布时间】:2011-12-21 20:52:46
【问题描述】:

无论我以哪种方式混合它,它都会给我带来错误。当我不断收到这些错误时,我感觉我遗漏了一些明显的东西。

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

System.Data.Edm.EdmAssociationType: : 多重性与关系“Venue_Courses”中角色“Venue_Courses_Source”中的引用约束冲突。由于 Dependent Role 中的所有属性都不可为空,因此 Principal Role 的复数必须为“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
            
}

【问题讨论】:

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


    【解决方案1】:

    希望这仍能及时为您提供帮助。我也遇到了完全相同的问题,并且为此困扰了将近一个小时,直到我发现了我的错误。

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

    public int? VenueId { get; set;}
    

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

    【讨论】:

    • 非常感谢,我也很高兴我不是唯一一个! ;)
    • 哇!你救了我的理智:)
    • 为我节省了很多时间。谢谢!
    【解决方案2】:

    在网上搜索后

    System.Data.Edm.EdmAssociationType: : Multiplicity 与 Role 中的引用约束冲突

    它不断提出这篇文章,所以这是我的问题和解决方案:

    我使用 vs ef 逆向工程扩展将一个大型项目从 ef4.0 升级到 ef4.1。我们的 mvc 应用使用 metadatatype 和 partials 来装饰 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; }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 2012-05-02
          相关资源
          最近更新 更多