【问题标题】:One-2-One association and inheritanceOne-2-One 关联和继承
【发布时间】:2013-01-18 20:49:15
【问题描述】:

我有一个以 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的时候要删除E.B和E.C。

有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

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

    你有两个选择:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2020-12-13
      • 1970-01-01
      相关资源
      最近更新 更多