TPT之上的实体框架TPH

时间:2016-09-05 12:46:21

标签: entity-framework ef-fluent-api table-per-type table-per-hierarchy

此问题将在3个类别中解释:帐户 IndividualAccount 医生

  • 前两个类是抽象的
  • IndividualAccount是Account的子类
  • Doctor是IndividualAccount的子类

第一层继承(在Account和IndividualAccount之间)正在使用 Table Per Type 方法实现。 第二层继承(在IndividualAccount和Doctor之间)正在使用每个层次结构表方法进行填充。

Fluent API 配置如下:

if (!empty($_REQUEST) && array_key_exists('do_xml_import',$_REQUEST)){
    $argv = array_keys($_REQUEST);
}

我们对此配置的期望是拥有两个表:第一个存储所有用户的Id和公共属性(例如用户名和密码),第二个表存储所有个人共有的属性(例如姓名和电话号码)。此外,第二个表格将有一个鉴别字段,用于区分医生和我们可能拥有的其他类型的个人。

当我试图通过它的身份获得医生时出现问题。将抛出一个例外,声称许多列无效,其中最重要的一列是:
无效的列名称'Discriminator'。\ r \ n

令我惊讶的是,如果我将 [Table(“IndividualAccounts”)] 置于IndividualAccount类定义之上,问题将得到解决。但我已经在配置(Fluent API)中设置了表名。除了Fluent API之外,为什么还要使用注释?

更新
在Annotation存在的情况下,Doctor的属性被放置在 IndividualAccounts 表中,这确实是我们所期望的。但是,如果我删除注释,将创建一个新的迁移,尝试将这些字段移动到基表帐户

1 个答案:

答案 0 :(得分:1)

  

令我惊讶的是,如果我将[Table(“IndividualAccounts”)]置于IndividualAccount类定义之上,问题将得到解决。但是我   已经在配置中设置了表名(Fluent API)。为什么   我应该在Fluent API之外使用注释吗?

没有问题没有解决现在隐藏的问题。只需用SSM检查,IndividualAccounts表不包含Discriminator列!

ToTable("IndividualAccounts");

抛出 UnsupportedHybridInheritanceMapping 异常,只需启用所有异常,即可获得:

更多信息:

Multiple inheritance with Entity Framework TPC

我修改了我的课程,现在我也可以看到鉴别器了。

下次请在课程上发布问题。更多信息:How to create a Minimal, Complete, and Verifiable example

如果您使用以下行代码,这将禁用约定异常,但您将在以后获得另一种问题:

modelBuilder.Conventions.Remove<MappingInheritedPropertiesSupportConvention>();

EF试图创建TPC而不是TPT的问题我将与EF-Team联系并给你反馈。