首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TPT之上的实体框架TPH

TPT之上的实体框架TPH
EN

Stack Overflow用户
提问于 2016-09-05 12:46:21
回答 1查看 384关注 0票数 3

这个问题将围绕三个类进行解释:Account、和 be .

  • 前两个类是抽象的。
  • IndividualAccount是帐户的子类
  • 医生是IndividualAccount的子类

第一层继承(在Account和IndividualAccount之间)是用表(每种类型的方法)实现的。第二层继承(在IndividualAccount和医生之间)是用表实现的,每个层次结构方法。

Fluent API配置如下:

代码语言:javascript
复制
class AccountConfiguration : EntityTypeConfiguration<Account>
  public AccountConfiguration()
  {
    HasKey(x => x.Id);
    ...
  }
}

class IndividualAccountConfiguration : EntityTypeConfiguration<IndividualAccount>
{
  public IndividualAccountConfiguration()
  {
    ToTable("IndividualAccounts");
    ...
  }
}

class DoctorConfiguration : EntityTypeConfiguration<Doctor>
{
  public DoctorConfiguration()
  {
    ...
  }
}

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

当我试图用身份证来找医生时,问题就出现了。将抛出一个异常,声称许多列无效,其中最重要的一个是:

无效列名“判别器”。\r\n

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

更新

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

EN

回答 1

Stack Overflow用户

发布于 2016-09-05 15:57:00

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

不,问题没有解决,问题现在是隐藏的。只要用SSM检查一下,IndividualAccounts表不包含鉴别列!

代码语言:javascript
复制
ToTable("IndividualAccounts");

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

更多信息:

Multiple inheritance with Entity Framework TPC

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

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

如果使用下面的行代码,这将禁用约定异常,但稍后会遇到另一种问题:

代码语言:javascript
复制
modelBuilder.Conventions.Remove<MappingInheritedPropertiesSupportConvention>();

问题EF尝试创建TPC而不是TPT,我将与EF-团队取得联系,并给您一个反馈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39330948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档