处理继承时避免在 EF Core 中使用鉴别器

问题描述

从 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 中,从上下文中获取对象会出现错误“无效的列名‘鉴别器’”。是的,我的表中没有鉴别器列(显然在使用 TPH 模式时它是必需的)但它在 EF 中没有它就可以完美运行。在这种情况下,EF 如何处理继承?此外,创建这样的列并用相同的数据(派生类名)填充它似乎没有用。感觉应该是我遗漏了什么。

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

解决方法

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

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

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

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