正如我在我的问题Eagerly Load Navigation Property 中List<OfSomeBaseClass>
发现的那样,无法使用 EF.Include()
方法加载派生类的属性(这已被建议为未来的 EF 功能)。
我通过迭代包含兄弟类型混合的集合来解决这个问题,分别调用
ctx.Entry(myDerivedType).Reference("PropOfDerivedType").Load();
这会导致对数据库进行许多额外的往返,但至少它可以工作。
现在我需要加载这样的对象层次结构并将其保存在 MVC Web 应用程序的 Session 中。由于DbContext
不应该是会话的一部分,我相信我必须加载对象图AsNoTracking()
,如下所示:
var myGraph = (from my in ctx.MyHierarchyRoot.Include("NonDerivedStuff")
.AsNoTracking()
where CONDITION select my).Single();
问题 1
.AsNoTracking()
如果将对象图存储在Session中,使用是否必要且正确?
然后我继续遍历层次结构中的派生兄弟并尝试像这样加载它们:
foreach (SomeBase b in myGraph.SomeCollection)
{
if (b is SomeConcreteDerivedType)
{
ctx.Entry(b).Reference("SomePropertyOfSomeConcreteDerivedType").Load();
}
}
但是,由于我使用 myGraph 加载.AsNoTracking()
,我得到:
无法为属性“SomePropertyOfSomeConcreteDerivedType”调用成员“Load”,因为上下文中不存在“SomeConcreteDerivedType”类型的实体。要将实体添加到上下文中,请调用 DbSet 的 Add 或 Attach 方法。
问题2
假设问题 1 的答案是“是”,如何正确加载派生类型的导航属性?