从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)
获得动态类的实例。
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 TPH通常会在没有太多问题的情况下传递到EF Core,但是两者之间的自定义选项是不同的,例如在Core中,我们现在可以通过流畅的符号轻松地操作discriminator: https://www.learnentityframeworkcore.com/configuration/fluent-api/hasdiscriminator-method
检查你的基类是不是abstract: https://stackoverflow.com/a/34646164/1690217
- 如果你的基类是
abstract
,那么你将不得不手动配置Discriminator
列:https://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy#configuration
还要检查从以前的EF迁移的数据库模式实际上有Discriminator
列,并且它是一个字符串类型,实际值应该是类型的名称,但是有可能您已经在其他地方配置或应用了覆盖默认行为的约定(在EF或EF Core实现中)
如果您在数据库中包含实际的模式或构建表的迁移条目,您可能会得到更确定的答案。