此问题将在3个类别中解释:帐户, 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 表中,这确实是我们所期望的。但是,如果我删除注释,将创建一个新的迁移,尝试将这些字段移动到基表帐户!
答案 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联系并给你反馈。