1

私の質問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 に対する答えが「はい」であると仮定すると、派生型のナビゲーション プロパティを正しく読み込むにはどうすればよいでしょうか?

4

1 に答える 1

2

.AsNoTracking()オブジェクトグラフがセッションに保存される場合、使用する必要があり、正しいですか?

セッションに格納されたエンティティがコンテキストへの参照を保持していないこと (およびコンテキストを必要としないこと) を確認する必要があります。これは、エンティティをセッションに保存する前に切り離すことによって実行する必要がありますが、切り離すと常に関係が壊れます。この場合の最も簡単な回避策は、プロキシの作成を無効にすることです (遅延読み込みと動的変更追跡は機能しません)。

代替アプローチは、通常の方法でエンティティ グラフを読み込み、グラフのディープ クローン (シリアル化) を作成することです。ディープ クローンは常にコンテキストから完全に切り離されており、セッションに安全に格納できます。

于 2012-05-24T08:58:37.170 に答える