从EF转换到EF核心(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核心
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中,从上下文中获取对象会出现“无效列名‘鉴别器’”错误。是的,我的表中没有区分器列(显然在使用TPH模式时它是必需的),但是它在EF中没有很好的工作。在这种情况下,EF是如何处理继承的?此外,创建这样的列并使用相同的数据(派生类名)填充它似乎是无用的。感觉应该有我错过的东西。
那么,我的问题是:有什么方法可以解决这个问题而不创建一个判别器列呢?
发布于 2021-03-03 13:09:05
默认的EF通常会传递到EF,没有太多的问题,但是两者之间的自定义选项是不同的,例如,在核心中,我们现在可以很容易地通过fluent符号操纵鉴别器:https://www.learnentityframeworkcore.com/configuration/fluent-api/hasdiscriminator-method
检查基类是否是抽象的:https://stackoverflow.com/a/34646164/1690217
如果基类是https://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy#configuration,则必须手动配置Discriminator
列:
还请检查您以前的EF迁移中的数据库模式是否确实有Discriminator
列,并且它是一个字符串类型,实际值应该是类型的名称,但是您可能已经在其他地方配置或应用了覆盖默认行为的约定(无论是在EF还是EF实现中)。
如果将实际模式包含在数据库中或构建表的迁移条目中,则可能会得到更明确的答案。
https://stackoverflow.com/questions/66457096
复制相似问题