私の質問Eagerly Load Navigation Property that isList<OfSomeBaseClass>
.Include()
で発見したように、EFメソッドを使用して派生クラスのプロパティをロードすることはできません(これは将来の EF 機能として提案されています)。
これを回避するには、兄弟の型が混在するコレクションを繰り返し、個別に呼び出します
ctx.Entry(myDerivedType).Reference("PropOfDerivedType").Load();
これにより、データベースへの余分なラウンドトリップが多数発生しますが、少なくとも機能します。
このようなオブジェクト階層をロードして、MVC Web アプリケーションのセッションに保存する必要があります。DbContext
はセッションの一部であってはならないため、次のようにオブジェクト グラフをロードする必要があると思います。AsNoTracking()
var myGraph = (from my in ctx.MyHierarchyRoot.Include("NonDerivedStuff")
.AsNoTracking()
where CONDITION select my).Single();
質問1
.AsNoTracking()
オブジェクトグラフがセッションに保存される場合、使用する必要があり、正しいですか?
次に、階層内の派生兄弟を繰り返し処理し、次のようにロードしようとします。
foreach (SomeBase b in myGraph.SomeCollection)
{
if (b is SomeConcreteDerivedType)
{
ctx.Entry(b).Reference("SomePropertyOfSomeConcreteDerivedType").Load();
}
}
ただし、を使用して myGraph をロードしたため.AsNoTracking()
、次のようになります。
タイプ 'SomeConcreteDerivedType' のエンティティがコンテキストに存在しないため、メンバー 'Load' をプロパティ 'SomePropertyOfSomeConcreteDerivedType' に対して呼び出すことはできません。エンティティをコンテキストに追加するには、DbSet の Add メソッドまたは Attach メソッドを呼び出します。
質問2
質問 1 に対する答えが「はい」であると仮定すると、派生型のナビゲーション プロパティを正しく読み込むにはどうすればよいでしょうか?