0

我正在尝试从集合的元素中加载属性,该集合本身就是另一个类的属性。集合的元素是多态的,不共享我试图包含的属性,并通过 TPH(Table-per-Hierachry)在 DB 中进行跟踪。当我尝试急切加载它们时,会引发异常,指出基类不包含请求的属性。

我有一个抽象基类Base和两个派生类DerivedADerivedB. Base已像这样为 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的属性的类。我期待 EF Core 能够处理这个问题。我错了吗?public ICollection<Base> Bases {get; set; }DerivedADerivedB

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

4

1 回答 1

0

因此,在写完整个问题后,我又尝试了一件事。只包括Bases喜欢toBeLoadedSet.Include(tbl => tbl.Bases)。出于某种原因,我以为我之前尝试过,然后在哪里尝试过PropA,但只是想确定一下。ProbBnull

既然它现在就在那里,它可能会阻止其他人浪费他们的时间,所以我会发布它。谢谢你做我的橡皮鸭。

需要明确的是,该LoadRelated方法现在看起来像这样

public static IQueryable<ToBeLoaded> LoadRelated(this DbSet<ToBeLoaded> toBeLoadedSet)
{
    return toBeLoadedSet.Include(tbl => tbl.Bases);
}
于 2019-09-25T14:51:47.377 回答