c# - Entity Framework 6 Code First TPH 多个派生类中的外键

标签 c# entity-framework

我试图了解当基类中不存在外键时,我需要做什么才能在多个派生类中引入相同的外键。外键是相同的类型,并且我能够使各个派生类都使用相同的列名,但是当我尝试引入外键注释时, Entity Framework 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; }
}

最佳答案

决议EF issue 1964解释说:“然而,在 s 空间中建立关联无论如何都不起作用,因为它会产生两个数据库约束,只有当依赖关系也与其他关系类型的 PK 匹配时才能满足这些约束。这样的匹配通常只会发生意外。解决方案是从 s-space 中删除关联,就像我们对类似的 TPC 映射所做的那样。” (强调我的)

EF 删除合并列上的 FK。在您的例子中,两个 FK 在逻辑上是相同的,但 EF 不知道(或关心)这一点。

关于c# - Entity Framework 6 Code First TPH 多个派生类中的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27286464/

相关文章:

.net - Entity Framework (QueryBuilder) - where 子句 "it"前缀

c# - 如何避免 NullReferenceException?

sql - VS 2013 中是否有 localdb (mdf) 的级联删除选项

asp.net-mvc - EntityFramework 代码首次迁移在部署到 Azure 后未运行

asp.net - MVC 的最佳实践.. ViewModel 绑定(bind)使用接口(interface)示例

c# - ASP.NET 5 多个 dbcontext 问题

c# - 在 .Net 4.7.2 中导入 AngleSharp 时绑定(bind)重定向以某种方式尝试将 NetStandard 2 作为 dll 引入

c# - Assembly.GetTypes() - 获取加载失败的类型

c# - List<MyClass> 作为 DropDownList 的数据源?

c# - WCF 如何避免定义许多操作契约(Contract)