实体框架代码优先 - 将两个字段合并为一个集合

Posted

技术标签:

【中文标题】实体框架代码优先 - 将两个字段合并为一个集合【英文标题】:entity framework code first - Union of the two fields into one collection 【发布时间】:2012-01-31 14:32:47 【问题描述】:

我有这个型号和配置

public class Person
 
     public int? FatherId  get; set; 
     public virtual Person Father  get; set; 
     public int? MotherId  get; set; 
     public virtual Person Mother  get; set; 
     public virtual List<Person> Childs  get; set; 

 
 class PersonConfiguration : EntityTypeConfiguration<Person>
 
     public PersonConfiguration()
     
         HasOptional(e => e.Father).WithMany(e => e.Childs)
              .HasForeignKey(e => e.FatherId);
         HasOptional(e => e.Mother).WithMany(e => e.Childs)
              .HasForeignKey(e => e.MotherId);
     
 

我在类型为初始的地方得到这个错误。

指定的架构无效。错误:(151,6):错误 0040:类型 Person_Father 未在命名空间 ExamModel (Alias=Self) 中定义。

有没有办法通过两个属性(motherId 和fatherId)映射Childs 属性?

【问题讨论】:

【参考方案1】:

不可能将两个导航属性映射到单个集合属性。看起来很可笑,但你必须有两个集合属性

public class Person
 
     public int? FatherId  get; set; 
     public virtual Person Father  get; set; 
     public int? MotherId  get; set; 
     public virtual Person Mother  get; set; 
     public virtual List<Person> ChildrenAsFather  get; set; 
     public virtual List<Person> ChildrenAsMother  get; set; 
 

 class PersonConfiguration : EntityTypeConfiguration<Person>
 
     public PersonConfiguration()
     
         HasOptional(e => e.Father).WithMany(e => e.ChildrenAsFather)
              .HasForeignKey(e => e.FatherId);
         HasOptional(e => e.Mother).WithMany(e => e.ChildrenAsMother)
              .HasForeignKey(e => e.MotherId);
     
 

【讨论】:

【参考方案2】:

谢谢你,Eranga,你的回复正是我所需要的!

此外,如果有人使用该方法而不是 Eranga 使用的配置方法,这里是模型构建器代码。

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.Entity<Person>().
    HasKey(i => i.PersonId);

    modelBuilder.Entity<Person>().
    HasOptional(f => f.Father).
    WithMany(f => f.ChildrenAsFather).
    HasForeignKey(f => f.FatherId);

    modelBuilder.Entity<Person>().
    HasOptional(m => m.Mother).
    WithMany(m => m.ChildrenAsMother).
    HasForeignKey(m => m.MotherId);

【讨论】:

以上是关于实体框架代码优先 - 将两个字段合并为一个集合的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先 - 孤立解决方案?

使用实体框架代码首先获得来自同一个父表的两个外键,而无需指定父实体上的集合

将关系映射到实体框架中的抽象集合

如何使用实体框架代码优先从数据库中删除所有相关实体

实体框架代码优先 - 通过主键将子实体添加到父实体

EF 代码优先:如何在遵循 DDD 时从实体的集合中删除一行?