【问题标题】:EF Core 3.1 - DB First and InheritanceEF Core 3.1 - 数据库优先和继承
【发布时间】:2020-04-23 11:30:17
【问题描述】:

我在我的数据库中创建了 3 个表,每个表都有一个主键。

Person, Man, Woman

这个想法是 Man 和 Woman 从 Person 继承,所以他们的主键也是 Person PK 的 FK。

我使用 Scaffold-DbContext 命令生成模型,显然我的模型中没有任何继承,因此我明确地这样做了...:

Man : Person {...}
Woman : Person {...}

但是仍然缺少一些东西,因为我收到了运行时错误: “无法在 'Man' 上配置密钥,因为它是派生类型。必须在根类型 'Person' 上配置密钥。”

如果我这样做,那么我会得到一个错误,相反我应该在基类中而不是在派生类中设置 Key。

有没有使用 DB First 方法的解决方案?

我不介意数据库内部的外观(1 个表也可以使用鉴别器),我只想在我的模型中继承。

谢谢

【问题讨论】:

  • 创建代码优先模型以查看模式,您将看到表格需要的外观。
  • This guide 关于 EF Core 中的继承显示只有父类具有键列。示例中有一个使用鉴别器的数据库表。
  • 您的意思是,如果我正确定义了数据库(使用鉴别器字段的 1 个表),那么当我运行命令 Scaffold-DbContext 时,我将获得具有继承的模型以及正确设置的 DBContext?

标签: sql database asp.net-core ef-core-3.1


【解决方案1】:

您所描述的是每个类型关系继承模式的 TPT 或表。 EF Core 仅支持 TPH 或每个层次结构的表。在 TPH 中,所有子类型的所有属性都放入一个基本类型的表中,并添加一个鉴别器列来指示实际类型。 很长站在issue 对此,终于在 6 年后开始获得一些牵引力。不过,它是针对 EF Core 5.0 的,所以我们至少还有一年的时间,除非它进一步下滑。

【讨论】:

  • TPH 也适用于我。但是,我发现使用 Code first 很容易实现它,但是使用 DB first 我不太确定。只是在数据库中定义一个鉴别器列然后运行脚手架命令吗?还是我还需要做其他事情?谢谢
猜你喜欢
  • 2018-09-05
  • 2020-05-22
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多