【发布时间】: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