EF Core-具有多态元素的集合上的ThenInclude()

时间:2019-09-25 14:51:47

标签: polymorphism entity-framework-core tph

我正在尝试从集合的元素中加载属性,而集合本身就是另一个类的属性。集合中的元素是多态的,不共享我试图包含的属性,而是通过TPH(逐层表)在数据库中跟踪的。当我尝试热切加载它们时,抛出异常,指出基类不包含请求的属性。

我有一个抽象基类Base和两个派生类DerivedADerivedBBase已为此类TPH配置

internal static void Configure(ModelBuilder builder)
{
    // Get the EntityTypeBuilder from the given ModelBuilder
    EntityTypeBuilder<Base> entityBuilder = builder.Entity<Base>();

    // Configure TPH
    entityBuilder.ToTable("Bases").HasDiscriminator<int>("DerivedType")
                 .HasValue<DerivedA>(0)
                 .HasValue<DerivedB>(1);
}

此外,我还有一个类ToBeLoaded和一个属性public ICollection<Base> Bases {get; set; },该属性确实包含DerivedADerivedB。我希望EF Core能够处理此问题。我错了吗?

EF Core Docs说我可以像在扩展方法中一样使用as或在ThenInclude()中直接投射。

public static IQueryable<ToBeLoaded> LoadRelated(this DbSet<ToBeLoaded> toBeLoadedSet)
{
    return toBeLoadedSet.Include(tbl => tbl.Bases)
                               .ThenInclude(b => (b as DerivedA).PropA)
                               .Include(tbl => tbl.Bases)
                               .ThenInclude(b => (b as DerviedB).PropB);
}

然后调用context.ToBeLoadedSet.LoadRelated.ToList();时会引发以下异常

System.InvalidOperationException: 'The property 'PropA' is not a navigation property of entity type 'Base'. The 'Include(string)' method can only be used with a '.' separated list of navigation property names.'

我已经尝试使用其他方法来实现文档中建议的方法,即直接强制转换和Include(string)方法。 我知道这与文档中的示例有些不同,但这是我所能找到的最接近的情况。

使用Include接口在理论上甚至可行吗?还是我应该尝试使用RawSQL

1 个答案:

答案 0 :(得分:0)

因此,在写下整个问题之后,我又尝试了另一件事。像Bases一样包含toBeLoadedSet.Include(tbl => tbl.Bases)。由于某种原因,我认为我之前尝试过此操作,然后尝试过PropAProbB,其中null,但是只是想确定一下。

由于现在仍然存在,并且它可能会阻止其他人浪费时间,因此我将其发布。感谢您成为我的橡皮鸭。

要清楚,LoadRelated方法现在看起来像这样

public static IQueryable<ToBeLoaded> LoadRelated(this DbSet<ToBeLoaded> toBeLoadedSet)
{
    return toBeLoadedSet.Include(tbl => tbl.Bases);
}