Entity framework 1-2-1关联与继承

Entity framework 1-2-1关联与继承,entity-framework,ef-code-first,Entity Framework,Ef Code First,我有一个根为A的继承链,其子类型为B和C。接下来,我有一个实体E,如下所示: public class E { public Guid Id {get; set;} public B B {get; set;} public C C {get; set;} } 导航属性应该映射到两个1-2-1关联,其中E是主体,B,C是从属项。这将不起作用,因为EF将使用E.Id的值作为B和C的外键,这将导致表a中出现重复的键。使用TPT、TPC或TPH并不重要 如果我将它映射为两个

我有一个根为A的继承链,其子类型为B和C。接下来,我有一个实体E,如下所示:

public class E 
{
    public Guid Id {get; set;}
    public B B {get; set;}
    public C C {get; set;}
}
导航属性应该映射到两个1-2-1关联,其中E是主体,B,C是从属项。这将不起作用,因为EF将使用E.Id的值作为B和C的外键,这将导致表a中出现重复的键。使用TPT、TPC或TPH并不重要

如果我将它映射为两个一个二个多关联,并在E中使用不同的外键,即映射:

Entity<E>().HasRequired(x=>x.B).WithMany().HasForeignKey(x=>x.BId);
Entity<E>().HasRequired(x=>x.C).WithMany().HasForeignKey(x=>x.CId);
Entity().HasRequired(x=>x.B).WithMany().HasForeignKey(x=>x.BId);
Entity().HasRequired(x=>x.C).WithMany().HasForeignKey(x=>x.CId);
而级联删除不会朝正确的方向工作。即删除E.B时,应删除E.B和E.C


如何处理此问题的任何建议?

EF要求每个关系(继承或关联)有一个映射列。您使用一列up进行继承,因此此列在关联关系的子类中不可用(因为您必须从子类中删除它)

您有两种选择:

  • 通过将E链接到A(超类),可以将E的1-1关系映射到B和C。但这不是模型的精确表示,因为{B,C}关系是到E,而不是到A

  • 在B和C中添加另一列,该列将用于与E的关联。此新列应是唯一的,且不为空-因为实际上您正在创建另一个主键。现有主键和新列都唯一标识记录(对于B或C)。在数据库中,使用这个新列创建{B,C}和E之间的约束。现在EF将能够同时表示继承{A