2017-02-02 8 views
7

実際、エンティティとそのナビゲーションプロパティの一部を取得するLinqクエリがあります。AsNoTracking()とInclude

context.MyEntity 
    .AsNoTracking() 
    .Include(i=> i.Nav1) 
    .Include(i=> i.Nav2) 
    .Where(x=> x.Prop1==1) 
    .FirstOrDefault(); 

は今、私の質問は:MyEntityとNAV1、NAV2を追跡したり、各ナビゲーションプロパティのAsNoTrackingを追加する必要がありませんため

このクエリ十分です。

context.MyEntity 
    .AsNoTracking() 
    .Include(i=> i.Nav1) 
    .AsNoTracking() 
    .Include(i=> i.Nav2) 
    .AsNoTracking() 
    .Where(x=> x.Prop1==1) 
    .FirstOrDefault(); 
+1

最初の例が正しいので、クエリごとに一度 'AsNoTracking'が必要です。私は、2番目のものは実行時例外をスローすると信じています(どれがどちらか分かりません)。 – Igor

+0

複数のLINQメソッドを連結する場合、返されたシーケンスは常に以前のメソッドから次のメソッドに渡されます。だから 'AsNoTracking'の後に返されたエンティティがキャッシュされないクエリがある –

+0

あなたの助けにTks –

答えて

4

すべてのクエリパラメータを完了した後で、データをメモリに移動する前にAsNoTrackingを使用します。この例では、次のように指定します。

context.MyEntity 
    .Include(i=> i.Nav1) 
    .Include(i=> i.Nav2) 
    .Where(x=> x.Prop1==1) 
    .AsNoTracking() 
    .FirstOrDefault(); 

親エンティティの子オブジェクトはすべて追跡されません。

関連する問題