Jak już wskazał Ladislav w komentarzu, musisz wyłączyć automatyczne wykrywanie zmian, aby poprawić wydajność:
context.Configuration.AutoDetectChangesEnabled = false;
To wykrywanie zmian jest domyślnie włączone w DbContext
interfejsie API.
Powodem, dla którego DbContext
zachowuje się tak inaczej niż ObjectContext
API, jest to, że o wiele więcej funkcji DbContext
API będzie wywoływać DetectChanges
wewnętrznie niż funkcje ObjectContext
API, gdy włączone jest automatyczne wykrywanie zmian.
Tutaj znajdziesz listę tych funkcji, które są wywoływane DetectChanges
domyślnie. Oni są:
- Te
Add
, Attach
, Find
, Local
, lub Remove
członków wDbSet
- Członkowie
GetValidationErrors
, Entry
lub SaveChanges
wDbContext
Entries
Metoda naDbChangeTracker
Szczególnie Add
połączenia, DetectChanges
które są odpowiedzialne za słabą wydajność, jakiej doświadczyłeś.
W przeciwieństwie do tego ObjectContext
API wywołuje DetectChanges
tylko automatycznie, SaveChanges
ale nie w, AddObject
i inne odpowiednie metody wymienione powyżej. To jest powód, dla którego domyślna wydajność ObjectContext
jest szybsza.
Dlaczego wprowadzili to domyślne automatyczne wykrywanie zmian DbContext
w tak wielu funkcjach? Nie jestem pewien, ale wydaje się, że wyłączenie go i DetectChanges
ręczne wywoływanie we właściwych punktach jest uważane za zaawansowane i może łatwo wprowadzić subtelne błędy do twojej aplikacji, więc używaj go ostrożnie .