2012-10-22 14 views
6

Czytam here, że podczas kwerendy danych dla operacji odczytu, ustawienie ObjectTrackingEnabled na false daje nieco zwiększyć wydajność. Moje zapytania wyglądać następująco:ObjectTrackingEnabled i linq-to-sql

public return type TheQueryName (some parameters) 
{ 
    using (TheDC MyDC = new TheDC()) 
    { 
     var TheQuery = (...).ToList(); 

     return TheQuery; 
    } 
} 

1) Jeśli chcę dodać zwiększenia wydajności, mogę tylko dodać linię ObjectTrackingEnabled = true; tuż przed linią var TheQuery = (...).ToList();

2) Ponadto, jeśli ustaw ObjectTrackingEnabled na true w zapytaniu, czy przed przywróceniem ustawienia trzeba ustawić wartość false, czy też ustawiam tylko ObjectTrackingEnabled dla konkretnej instancji kontekstu danych, a po tym, jak utworzę nowy kontekst danych, wartość ObjectTrackingEnabled zostanie przywrócona Wróć t o jego domyślny stan: false?

Uwaga: Dodaję tylko ObjectTrackingEnabled = false; do operacji odczytu.

Dzięki.

+0

Jest to kolejny przydatny blogu o tym, jak można dostać CRAZY spod kontroli, jeśli jesteś niepotrzebnie śledzenia rzeczy: https://weblog.west-wind.com/posts/2014/dec/21/gotcha -entity-framework-gets-slow-in-long-iteration-loops –

Odpowiedz

8

ObjectTrackingEnabled określa, czy Kontekst danych (TheDC w twoim przypadku) będzie śledził zmiany w elementach po ich załadowaniu. To, czy tego chcesz, zależy od konkretnego przypadku.

Naturalnie, mając mniej danych w kontekście danych, sprawisz, że będzie działał szybciej, ale kosztem obciążenia jesteś ze zmianami w śledzeniu. Dlaczego śledzenie zmian jest fajne? Ponieważ można:

  1. Obciążenie niektóre podmioty z pewnym kontekście
  2. modyfikować je
  3. Dodaj nowe, usuwać innym
  4. połączenia SaveChanges i niech postać kontekstowe dane się zrobić zapytań Aktualizacja dla podmiotów zmodyfikowanych , USUŃ dla usuniętych itp.

Po wyłączeniu śledzenia zmian, musisz jednoznacznie powiedzieć kontekstowi, co się zmieniło, jakie są nowe wartości itp.

Zakładając, że nadal nie chcesz śledzić obiektów, właściwość jest ustawiana dla każdej konkretnej instancji kontekstu danych. Oznacza to, że trzeba albo:

  1. ustawić go ręcznie dla każdego kontekstu danych utworzyć
  2. ustawić go jako domyślny dla kontekstu w konstruktorze kontekście jest tak: this.Configuration.AutoDetectChangesEnabled = true; Zobacz this blog post szczegółowe informacje

Mam nadzieję, że to pomoże!

+0

Dla jasności, ustawiam ObjectTrackingEnabled na false dla operacji odczytu. A jeśli chodzi o składnię, czy widzisz pytanie w punkcie 1)? – frenchie

+0

Jeśli chodzi o wyłączanie śledzenia zmian, zrobię to, gdy tylko utworzę kontekst. Tak więc, w twoim przypadku, przed zapytaniem, zaraz po wyrażeniu "używanie" –

0

Twoje tagi i wiersz tematu mówią "Linq2SQL", ale Twoje pytanie dotyczy obiektu Entity Framwork.

Dla 'tradycyjnego' linq2sql trzeba to zamiast:

linq2SqlDBContext.ObjectTrackingEnabled = false; 
+1

Simon_Weaver, AFAIK "DataContext" jest właściwym terminem w L2S; EF rozpoczęło się w/"ObjectContext", następnie dodano i przeniesiono do "DbContext". Ponadto L2S oferuje ObjectTrackingEnabled; zobacz, np .: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/how-to-retrieve-information-as-read-only – pakx

+0

To właśnie dostaję za używanie 3 różne generacje MS datakontekstu w tym samym czasie: - / –

1

W nawiązaniu do:

1) Jeśli chcę dodać zwiększenia wydajności, mogę tylko dodać linię ObjectTrackingEnabled = true; just before the line var TheQuery = (...).ToList();

Zwiększenie wydajności zapytania pochodzi z śledzenia NIE. Chcemy wyłączyć tę funkcję w zapytaniach READ, zaraz po utworzeniu nowego datacontextu.

ObjectTrackingEnabled = FALSE