Mam pytanie dotyczące .AsNoTracking()
rozszerzenia, ponieważ jest to całkiem nowe i dość mylące.
Używam kontekstu na żądanie dla witryny.
Wiele moich bytów się nie zmienia, więc nie trzeba ich śledzić, ale mam następujący scenariusz, w którym nie jestem pewien, co się dzieje z bazą danych, a nawet czy to ma znaczenie w tym przypadku.
Ten przykład to, co obecnie robię:
context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Jest to to samo co powyżej, ale usuwa .AsNoTracking()
z kroku 1:
context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Kroki 1 i 2 wykorzystują ten sam kontekst, ale występują w różnych momentach. Nie mogę wypracować, czy jest jakaś różnica. Ponieważ krok 2 jest aktualizacją, obaj i tak trafią do bazy danych dwa razy.
Czy ktoś może mi powiedzieć na czym polega różnica?
źródło
zobacz tę stronę Entity Framework i AsNoTracking
Co robi AsNoTracking
Entity Framework udostępnia wiele opcji dostrajania wydajności, które pomagają zoptymalizować wydajność aplikacji. Jedną z tych opcji strojenia jest
.AsNoTracking()
. Ta optymalizacja pozwala powiedzieć, abyEntity Framework
nie śledzić wyników zapytania. Oznacza to, żeEntity Framework
nie wykonuje żadnego dodatkowego przetwarzania ani przechowywania jednostek zwracanych przez zapytanie. Oznacza to jednak również, że nie można zaktualizować tych elementów bez ponownego dołączenia ich do wykresu śledzenia.przy użyciu AsNoTracking można uzyskać znaczny wzrost wydajności
źródło
Brak śledzenia zapytań LINQ do encji
Użycie AsNoTracking () jest zalecane, gdy twoje zapytanie jest przeznaczone do operacji odczytu. W tych scenariuszach odzyskujesz swoje byty, ale nie są one śledzone przez kontekst, co zapewnia minimalne zużycie pamięci i optymalną wydajność
Więcej informacji dostępnych tutaj:
Uwagi dotyczące wydajności dla Entity Framework
Entity Framework i NoTracking
źródło
Wyłączenie śledzenia spowoduje również przesyłanie strumieniowe zestawów wyników do pamięci. Jest to bardziej wydajne, gdy pracujesz z dużymi zestawami danych i nie potrzebujesz całego zestawu danych naraz.
Bibliografia:
źródło
AsNoTracking () pozwala na ominięcie wymogu „unikalnego klucza na rekord” w EF (niewymienionego wyraźnie innymi odpowiedziami).
Jest to niezwykle pomocne podczas czytania Widoku, który nie obsługuje unikatowego klucza, ponieważ być może niektóre pola są zerowalne lub natura widoku nie jest logicznie indeksowana.
W tych przypadkach „klucz” może być ustawiony na dowolną kolumnę, która nie ma wartości zerowej, ale następnie AsNoTracking () musi być używany z każdym zapytaniem, w przeciwnym razie rekordy (duplikaty według klucza) zostaną pominięte.
źródło
Jeśli masz coś innego, co zmienia DB (powiedzmy inny proces) i musisz upewnić się, że widzisz te zmiany, użyj
AsNoTracking()
, w przeciwnym razie EF może dać ci ostatnią kopię, którą miał kontekst, dlatego dobrze jest zwykle używać nowego kontekstu przy każdym zapytaniu :http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/
źródło