在解决方案中跨多个项目创建 TPT 继承时 EF6.x 是否存在问题?

Is there an issue with EF6.x when creating TPT inheritance across multiple projects in a solution?

考虑以下场景(在代码优先工作流中使用 EF6 和 VS 2017)。

我有一个基本的抽象实体库 class(它提供了一个 ID 属性 和一些适用于所有实体的其他属性)。

我有一个联系人 class 继承了 entitybase。它也是抽象的,并为应用程序将使用的典型业务对象(例如客户和供应商)提供通用属性,并提供名字和姓氏等内容。

最后还有继承自 Contact 的独立客户和供应商 class。

如果我将所有这些组件放在一个项目中,添加 EF Nuget 包,启用迁移,然后添加一个迁移,我得到我期望的每个类型 Table 结构 table (联系人 table 和单独的客户和供应商 table 通过外键链接到联系人 table)。满足联系人既可以是客户又可以是供应商的业务规则。

现在,在大型应用程序中,公共基础 class 很可能位于一个单独的项目中,该项目包含许多不同上下文共有的项目。联系人、客户和供应商 classes 很可能在他们自己的独立项目中,而联系人上下文在其自己的独立项目中。

如果我复制那个场景,然后启用和添加迁移,我最终会得到单独的客户和供应商 classes,他们有自己的从联系人继承的字段副本,但没有联系人 table .商业规则马上就被打破了。

这是 EF6 的已知问题吗?

如果这是一个小型应用程序,我会简单地将所有内容捆绑到一个项目中(所有内容都分成不同的文件夹)但是我希望沿着代码第一行改造现有的更大的应用程序并打破各种将模式分成单独的部分,这些部分本身很可能由许多项目组成更有意义。我很可能做错了什么,因为我仍然首先从代码开始,但如果有人遇到过这个,或者知道我应该如何安排组件以使其工作,我欢迎任何想法。

在这种情况下,EF6 基本实体发现过程似乎存在问题(当实体 类 程序集不同于 DbContext 程序集时)。

根据经验,始终公开继承根实体的多态 DbSet,或使用 Entity<T>() 流利 API.

显式标识它

因此,以下两个选项中的任何一个都可以解决问题:

public class MyDbContext : DbContext
{
    // ...
    public DbSet<Contact> Contacts { get; set; }
    // ...
}

public class MyDbContext : DbContext
{
    // ...
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // ...
        modelBuilder.Entity<Contact>();
        // ...
    }
    // ...
}