EF Core中每种具体类型的表格

时间:2016-10-30 12:26:49

标签: entity-framework asp.net-core

我为DB构建了以下层次结构模型:

        public abstract class ApplicationUser : IdentityUser 
        { }
        public class FirstUser : ApplicationUser 
        {}
        public class SecondUser : ApplicationUser

值得注意的是,抽象的Application类继承自ASP.NET Core Identity的不是 abstarct类IdentityUser。 所以我的目的是仅为UserFirst和UserSecond构建不同的表,而不是为IdentityUser和ApplicationUser构建 我尝试配置以下模型:

builder.Ignore<IdentityUser>();
builder.Entity<FirstUser>().ToTable("FirstUsers");
builder.Entity<SecondUser>().ToTable("SecondUsers");

然而它会引发异常:列名称无效&#39;判别器&#39;
我该怎么办?

1 个答案:

答案 0 :(得分:7)

EntityFrameework Core 1.0目前不支持每种类型的表格(TPC)或每种类型的表格(TPT)。仅支持每个层次结构表(TPH)。

TPC和TPT位于高优先级列表中,可能位于EntityFramewor Core 1.1或1.2中,请参阅EntityFramework Core Roadmap

  

待办事项功能

     

...

     

高优先级功能

     

...

     
      
  • 建模      
        
    • 更灵活的属性映射,例如构造函数参数,get / set方法,属性包等
    •   
    • 可视化模型以查看基于代码的模型的图形表示。
    •   
    • 简单类型转换,例如string =&gt; XML。
    •   
    • 空间数据类型,例如SQL Server的地理位置&amp;几何形状。
    •   
    • 没有连接实体的多对多关系。您已经可以使用连接实体建模多对多关系。
    •   
    • 关系数据库的备用继承映射模式,例如每种类型的表(TPT)和每种具体类型TPC的表。
    •   
  •   

关于你的问题:

你无能为力。如果您绝对需要此功能,则必须回退到EntityFramework 6.x,但是您无法定位.NET Core并且必须以.NET Framework 4.x为目标。

此处应注意,如果您需要使用EF6中使用的功能,Microsoft在生产环境中不会感觉(或建议)使用EntityFramework Core 1.0。它将需要几个版本(至少2个次要版本),直到EntityFramework Core无论如何都将以特征方式接近EF6。

因此,如果TPC是绝对要求,请返回EF6。

除了技术方面,性能方面明智的是它更喜欢使用TPH将继承映射到数据库,因为它避免了查询期间不必要的连接。当您使用TPT / TPC时,每个查询调用它都必须执行连接并且连接的性能较差。

因此,除非您必须映射到以这种方式设计的旧版数据库,否则您应该回退到TPH。