【问题标题】:Avoid using discriminator in EF Core when dealing with inheritance处理继承时避免在 EF Core 中使用鉴别器
【发布时间】:2021-03-03 12:28:59
【问题描述】:

从 EF 切换到 EF Core (3.1) 后出现的问题。

我有一个基础抽象类和一个在运行时动态创建的派生类(使用反射)。

我的基本类型的实体配置是 (EF):

        ToTable("TableName", "dbo");
        HasKey(t => t.Id);

        HasRequired(t => t.prop1).WithMany().HasForeignKey(t => t.prop1);
        Property(t => t.prop2).IsRequired();
        Property(t => t.prop3).IsRequired();

我使用此配置构建了基类,并使用 modelBuilder.Entity(type) 构建了动态类。 一切正常。我可以使用context.Objects 获取我的基类的实例,并使用Activator.CreateInstance(type) 获取动态类的实例。

现在我有相同的配置,但对于 EF Core

        builder.ToTable("TableName", "dbo");
        builder.HasKey(t => t.Id);

        builder.HasOne(t => t.prop1).WithMany().HasForeignKey(t => t.prop1);
        builder.Property(t => t.prop2).IsRequired();
        builder.Property(t => t.prop3).IsRequired();

但在 EF Core 中,从上下文中获取对象会出现错误“列名 'Discriminator' 无效”。是的,我的表中没有鉴别器列(显然在使用 TPH 模式时它是必需的),但是在 EF 中没有它的情况下它工作得很好。 EF 在这种情况下是如何处理继承的?此外,创建这样的列并用相同的数据(派生类名称)填充它似乎没有用。感觉应该是我缺少的东西。

所以,我的问题是: 有什么方法可以在不创建鉴别器列的情况下解决问题?

【问题讨论】:

  • 请从数据库中发布架构,听起来 EF 版本没有使用默认的 string 类型 Discriminator 列。
  • P.S.我使用数据库优先方法
  • 你到底为什么要这么做?如果动态类只使用基类/表的属性/列,它的目的是什么?它是某种代理吗?或者?您能否提供有关用例的更多详细信息,以便了解可以做什么。
  • 动态类不仅有基列(是的,它是代理)。它从配置文件中读取列名
  • 我的表有必需的属性(它在基类中定义)和附加的(用配置文件配置),所以我需要创建一个具有基类和附加属性的动态类

标签: c# entity-framework entity-framework-core ef-database-first


【解决方案1】:

默认的 EF TPH 通常会在没有太多问题的情况下通过 EF Core,但是两者之间的自定义选项不同,例如在 core 中,我们现在可以通过流利的表示法轻松操纵鉴别器:https://www.learnentityframeworkcore.com/configuration/fluent-api/hasdiscriminator-method

检查您的基类是否不是抽象:https://stackoverflow.com/a/34646164/1690217

还要检查您之前的 EF 迁移中的数据库架构是否确实具有 Discriminator 列并且它是字符串类型,实际值应该是类型的名称,但是它是您可能在其他地方配置或应用了覆盖默认行为的约定(在 EF 或 EF Core 实现中)

如果您在数据库中包含实际架构或构建表的迁移条目,您可能会得到更明确的答案。

【讨论】:

  • 是的,我没有鉴别器列(写在问题的末尾)。而且我不想创建它,因为我只有一个派生类,而我的基类是抽象的。我没有看到创建填充相同值的列的意义
  • 如果只有一张表,那么这种类型应该使用TPT,而不是TPH
  • 确保您的上下文中没有DbSet<baseType>,或基本类型的任何流畅配置。
  • 抱歉误解了您的问题,我以为您希望鉴别器像在 EF 中那样静默工作
  • 你也可以试试stackoverflow.com/a/62597286/1690217 不确定它是否在核心中工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
相关资源
最近更新 更多