实体框架代码优先 - 将两个字段合并为一个集合
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);
【讨论】:
以上是关于实体框架代码优先 - 将两个字段合并为一个集合的主要内容,如果未能解决你的问题,请参考以下文章