我正在尝试从集合的元素中加载属性,而集合本身就是另一个类的属性。集合中的元素是多态的,不共享我试图包含的属性,而是通过TPH(逐层表)在数据库中跟踪的。当我尝试热切加载它们时,抛出异常,指出基类不包含请求的属性。
我有一个抽象基类Base
和两个派生类DerivedA
和DerivedB
。 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
和一个属性public ICollection<Base> Bases {get; set; }
,该属性确实包含DerivedA
和DerivedB
。我希望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?
答案 0 :(得分:0)
因此,在写下整个问题之后,我又尝试了另一件事。像Bases
一样包含toBeLoadedSet.Include(tbl => tbl.Bases)
。由于某种原因,我认为我之前尝试过此操作,然后尝试过PropA
和ProbB
,其中null
,但是只是想确定一下。
由于现在仍然存在,并且它可能会阻止其他人浪费时间,因此我将其发布。感谢您成为我的橡皮鸭。
要清楚,LoadRelated
方法现在看起来像这样
public static IQueryable<ToBeLoaded> LoadRelated(this DbSet<ToBeLoaded> toBeLoadedSet)
{
return toBeLoadedSet.Include(tbl => tbl.Bases);
}