2017-02-02 21 views
7

Właściwie mam kwerendę Linq, która pobiera obiekt i niektóre jego właściwości nawigacyjne.AsNoTracking() i dołącz

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

Teraz moje pytanie brzmi:

Czy wystarczy do tego zapytania nie śledzić MyEntity i NAV1, Nav2 lub należy dodać AsNoTracking dla każdej nieruchomości nawigacji. tak:

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

Potrzebujesz tylko "AsNoTracking" raz na zapytanie, więc twój pierwszy przykład jest poprawny. Wierzę, że drugi rzuci wyjątek czasu wykonywania (nie wiem, który). – Igor

+0

Jeśli łańcuchujesz wiele metod LINQ, zawsze przekazujesz zwróconą sekwencję z poprzedniej metody do następnej. Więc po 'AsNoTracking' masz zapytanie, w którym zwrócone jednostki nie zostaną zbuforowane –

+0

Tks za twoją pomoc –

Odpowiedz

4

Użyj AsNoTracking po zakończeniu wszystkich parametrów zapytania, ale wcześniej przed przeniesieniem danych do pamięci. W tym przykładzie będziesz potrzebować:

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

Wszystkie obiekty podrzędne jednostki nadrzędnej nie będą śledzone.