在处理继承时避免在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中从上下文获取对象会给出一个错误&;无效的列名'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实现中)

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

相关内容

  • 没有找到相关文章

最新更新