【发布时间】:2018-03-22 18:47:47
【问题描述】:
简单地说,在 C# EF6 中,如何将两个导航属性映射到同一个表,同时保持它们的结果集分开?用简单的英语来说,我有一门课,我想在另一个课上收藏两个。换句话说,我想要两个相同类型但元素不同的集合。不幸的是,EF6 似乎将两个集合视为相同,并为它们提供相同的元素(表中的每条记录)。
我从几十个 StackOverflow 答案中找到的最好的是这个,但它有描述的问题。在这个例子中,一个父亲有许多儿子和许多女儿,他们每个人都有一个父亲。理想情况下,Sons和Daughters都可以存储在同一个表Child中。
class Father
{
[Key]
public long Id { get; set; }
public virtual ICollection<Child> Sons { get; set; }
public virtual ICollection<Child> Daughters { get; set; }
}
class Child
{
[Key]
public long Id { get; set; }
public long FatherId_1 { get; set; }
public Father Father_1 { get; set; }
public long FatherId_2 { get; set; } // One for each collection???
public Father Father_2 { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Child>()
.HasRequired(e => e.Father_1)
.WithMany(e => e.Sons)
.HasForeignKey(e => e.FatherId_1);
modelBuilder.Entity<Child>()
.HasRequired(e => e.Father_2)
.WithMany(e => e.Daughters)
.HasForeignKey(e => e.FatherId_2);
}
这样做的问题是,当从 Child 表中读取数据时,它不会区分 Sons 和 Daughters。也就是说,Sons 集合不仅包含 Sons,还包含 Daughters,Daughters 集合也是如此。我可能预计 EF6 会尝试使用鉴别器列,但它没有。
问题:如何将两个导航属性映射到同一个表中,并且仍然能够将其记录读回对应的导航属性中?或者,这个例子是否正确,而我的问题在其他地方?或者,这是不可能的,它们需要映射到自己的表(具有相同的架构)。
【问题讨论】:
标签: c# entity-framework-6