实体框架 6 在多个派生类中编码第一个 TPH 外键

本文关键字:编码 第一个 TPH 外键 派生 框架 实体 | 更新日期: 2023-09-27 18:33:07

我试图了解当外键不在基类中时,我需要做什么才能在多个派生类中引入相同的外键。 外键属于同一类型,我能够使各种派生类都使用相同的列名,但是当我尝试引入外键批注时,实体框架 6 以静默方式根本无法创建任何外键。

值得一提的是,如果我允许 EF 创建Bar_Name1而不是重用现有列,它会相应地添加外键。 但是我来自关系数据库背景,为同一件事使用多个列冒犯了我的敏感性。

我希望能够坚持使用注释来标记我的代码,但如果这是用注释无法完成但可以使用 Fluent API 完成的事情,我愿意深入研究。

public class Foo
{
    [Key]
    public string Name { get; set; }
}
public class FooSub1 : Foo
{
    [Required, Column("Bar_Name")]
    public string Bar_Name { get; set; }
    [ForeignKey("Bar_Name")]
    public Bar Bar { get; set; }
}
public class FooSub2 : Foo
{
    [Required, Column("Bar_Name")]
    public string Bar_Name { get; set; }
    [ForeignKey("Bar_Name")]
    public Bar Bar { get; set; }
}
public class Bar
{
    [Key]
    public string Name { get; set; }
}

实体框架 6 在多个派生类中编码第一个 TPH 外键

EF 问题 1964 的决议解释说:"但是,在这里的 s-space 中具有关联无论如何都不起作用,因为它会导致两个数据库约束,只有当依赖关系也匹配其他关系类型的 PK 时才能满足这两个约束。这样的比赛通常只会偶然发生。解决方案是从s空间中删除关联,就像我们对类似的TPC映射所做的那样

EF 将 FK 放在合并的列上。 在您的情况下,两个 FK 在逻辑上是相同的,但 EF 不知道(或关心)这一点。