简单地说,在C#EF6中,如何将两个导航属性映射到同一个表,同时保持它们的结果集是分开的?用简单的英语,我有一个班,我想在另一个班的两个集合。换句话说,我想要两个相同类型但具有不同元素的集合。不幸的是,EF6似乎将两个集合都视为相同,并为它们提供了相同的元素(表中的每条记录)。C#EF6:同一类型的两个导航属性
从数十个StackOverflow答案中找到的最好的是这个,但它有问题描述。在这个例子中,一个父亲有许多儿子和许多女儿,和他们每个人都有一个父亲。理想情况下,儿子和女儿可以存储在同一张表儿童。
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);
}
这里的问题是,读取数据从儿童表回来的时候,它不会儿子和女儿区分。也就是说,儿子集合将不仅包含儿子也女儿,并因此将女儿集合。我可能期望EF6尝试使用鉴别器列,但事实并非如此。
问题:如何将两个导航属性映射到同一个表并仍然能够将其记录读回到其相应的导航属性中?或者,这个例子是否正确,我的问题在其他地方?或者,这是不可能的,他们需要被映射到他们自己的表格(具有相同的模式)。
这是一个模型“孩子”,需要分成两个集合,而不是需要存储在一个表中的两个模型。你为什么要为模型中的同一逻辑类型创建两个类?你能告诉你如何在代码中解决上述问题吗? – drifter
如果我正在阅读该权利,它将一些属性映射到一个表和其他属性到另一个表。是对的吗?我在第一段中澄清了我的问题。基本上,我有一个班,我想在另一个班有两个集合。这似乎是一种常见的模式。我很困惑为什么没有什么信息。 – drifter