2

我有一个以 A 为根的继承链,其子类型为 B 和 C。接下来,我有一个像这样的实体 E:

public class E 
{
    public Guid Id {get; set;}
    public B B {get; set;}
    public C C {get; set;}
}

导航属性应映射到两个一对一关联,其中 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);

比级联删除不会朝着正确的方向工作。即删除e时应删除EB和EC。

任何建议如何处理这个?

4

1 回答 1

0

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

您有 2 个选择:

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

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

于 2013-07-03T16:30:28.970 回答