【问题标题】:Force Entity Framework to make 2 tables for 2 entities when an entity inherits from another?当一个实体从另一个实体继承时,强制实体框架为 2 个实体创建 2 个表?
【发布时间】:2018-01-04 15:44:36
【问题描述】:

在启用了自动迁移的代码优先、EF6 数据库中,我发现我有 4 个类:Formula、FormulaStep、Preparation、PreparationStep,但它们只有 3 个表:Formulae、FormulaSteps、Preparations。

我对此非常不满意,因为恕我直言,PreparationSteps 应该与 FormulaSteps 完全不同。意识到这是一个工作应用程序,有没有简单的方法来改变它?要强制创建 PrepareSteps 表,每行都引用作为其模板的 FormulaSteps 行?

我显然不想删除任何数据(在 db 中),也不想破坏应用程序,这可能以某种滑稽的方式依赖于这种交互,除了使用它来构建数据库。

PS 1:这里的公式是针对现实世界事物的计划。 准备是该计划的实例化。它代表了现实世界中的事物。

PS 2:类头是:

[DataContract]
public class FormulaStep : BaseData, ISearchable, ICloneable
{ ... }

[DataContract]
public class PreparationStep : FormulaStep, ISearchable, ICloneable
{ ... }

【问题讨论】:

    标签: entity-framework inheritance


    【解决方案1】:

    您可能想要设置Table per Concrete Type 映射。

    您可以通过告诉ModelBuilder 应该将您继承的实体存储到哪些表中来实现这一点。

    ModelBuilder.Entity<FormulaStep>().ToTable("FormulaSteps");
    ModelBuilder.Entity<PreparationStep>().ToTable("PreparationSteps");
    

    然后添加手动migration,它应该会自动为新表“PreparationSteps”搭建脚手架。在此迁移中添加额外的 SQL 以将具有 discriminator 值“PreparationStep”的所有行移动到新表中。也许脚手架迁移会从“FormulaSteps”中删除一些不再需要的列,因此请确保在删除数据之前移动数据(即在迁移中的任何DropColumn 语句之前)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多