繁体   English   中英

关于 EF Core 中的鉴别器,有没有办法用所有值设置基类?

[英]Regarding Discriminator in EF Core, is there a way to set the base class with all values?

我希望在检索基类时,我应该得到表中的所有行,而不考虑鉴别器。 我只想在检索派生类之一时使用鉴别器。 我怎样才能做到这一点?

我尝试的第一件事是只为派生类设置 HasValue 而不是这样的基类......

modelBuilder.Entity<BaseClass>(entity =>
{
   entity.HasDiscriminator(e => e.DiscriminatorProperty)
     // .HasValue<BaseClass>()
     .HasValue<DerivedClass1>(1)
     .HasValue<DerivedClass2>(2);
});

...但这给了我以下错误:

System.Private.CoreLib.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理:“实体类型“BaseClass”是层次结构的一部分,但未配置鉴别器值。”

我尝试的另一件事是为每个可能的鉴别器值配置 BaseClass 像这样......

modelBuilder.Entity<BaseClass>(entity =>
{
   entity.HasDiscriminator(e => e.DiscriminatorProperty)
     .HasValue<BaseClass>(1)
     .HasValue<BaseClass>(2)
     .HasValue<DerivedClass1>(1)
     .HasValue<DerivedClass2>(2);
});

...但是当实际尝试检索基类时,我只得到了鉴别器值为 1 的记录。EF Core 似乎只识别第一个配置并忽略下一个配置。

所以我的问题是如何专门为派生类而不是基类配置鉴别器? 换句话说,当检索基类时,我应该得到表中的所有记录。

EF Core 文档

在查询使用 TPH 模式的派生实体时,EF Core 在查询中添加一个谓词而不是鉴别器列。 此过滤器确保我们不会为结果中没有的基本类型或兄弟类型获得任何额外的行。 对于基本实体类型,将跳过此过滤谓词,因为查询基本实体将获得层次结构中所有实体的结果。

这向我表明您的代码应该是:

modelBuilder.Entity<BaseClass>(entity =>
{
   entity.HasDiscriminator(e => e.DiscriminatorProperty)
     .HasValue<BaseClass>(0)
     .HasValue<DerivedClass1>(1)
     .HasValue<DerivedClass2>(2);
});

然后,即使您的数据库只有 1 或 2 的鉴别器值,对BaseClass的查询也会得到所有行。

当您将派生类保存到数据库中,然后将其选择回来时,Entity Framework 将构造派生类并返回它。 这是设计使然。

如果您不需要保存基类的实例,它应该是抽象的。

当然,您始终可以.Select()仅选择任何特定查询所需的基类字段。

为避免层次结构问题,您需要将基类标记为抽象。 (您的 modelBuilder 只需要派生类,而不需要基类)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM