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

C# 在解决方案中跨多个项目创建TPT继承时,EF6.x是否存在问题?,c#,entity-framework-6,ef-code-first,C#,Entity Framework 6,Ef Code First,考虑以下场景(在代码优先工作流中使用EF6和VS 2017) 我有一个基本抽象entitybase类(它提供了一个ID属性和一些适用于所有实体的其他属性) 我有一个继承entitybase的contact类。它也是抽象的,为应用程序将使用的典型业务对象(例如客户和供应商)提供公共属性,并提供诸如名字和姓氏之类的内容 最后是从Contact继承的单独的Customer和Supplier类 如果我将所有这些组件放在一个项目中,添加EF Nuget包,启用迁移,然后添加迁移,我将按照我期望的表结构类型

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

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

我有一个继承entitybase的contact类。它也是抽象的,为应用程序将使用的典型业务对象(例如客户和供应商)提供公共属性,并提供诸如名字和姓氏之类的内容

最后是从Contact继承的单独的Customer和Supplier类

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

现在,在大型应用程序中,公共基类很可能位于一个单独的项目中,该项目包含许多不同上下文的公共项。contact、Customer和supplier类很可能位于各自独立的项目中,Contacts上下文位于各自独立的项目中

如果我复制该场景,然后启用并添加迁移,我最终会得到单独的Customer和Supplier类,它们拥有自己从Contact继承的字段副本,但没有Contacts表。业务规则立即被打破

这是EF6的已知问题吗


如果这是一个小型应用程序,我只需将所有内容捆绑到一个项目中(所有内容都可以分为不同的文件夹)然而,我希望按照代码第一行重新构建一个现有的更大的应用程序,并将各种模式分解为单独的部分,这些部分本身可能由许多项目组成,这更有意义。我可能做错了什么,因为我还是先从代码开始,但如果有人遇到过这种情况,或者知道我应该如何安排组件以使其正常工作,我欢迎大家的想法。

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

根据经验,始终公开继承根实体的多态
DbSet
,或使用
entity()
fluent API显式标识它

因此,以下两种选择之一可以解决问题:

public class MyDbContext : DbContext
{
    // ...
    public DbSet<Contact> Contacts { get; set; }
    // ...
}
公共类MyDbContext:DbContext
{
// ...
公共数据库集联系人{get;set;}
// ...
}

公共类MyDbContext:DbContext
{
// ...
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Entity();
// ...
}
// ...
}

Jus为清楚起见,
EntityBase
在一个项目中,
Contact
+派生+上下文在第二个项目中?EntityBase在一个项目中,Contact+派生在第二个项目中,上下文在第三个项目中。如果你认为它是a、b和c,那么c引用b,而b又引用a.Ed。我明白了。派生的cont是什么ext包含-仅限
DbSet
或?任何流畅配置?仅限客户和供应商的DbSet。一小段用于将dot net datetime映射到sql datetime的流畅api 2
public class MyDbContext : DbContext
{
    // ...
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // ...
        modelBuilder.Entity<Contact>();
        // ...
    }
    // ...
}