Automatyczne wykrywanie zmian
W przypadku korzystania z większości jednostek POCO określenie sposobu zmiany jednostki (i w związku z tym, które aktualizacje muszą być wysyłane do bazy danych) jest obsługiwane przez algorytm Wykryj zmiany. Wykrywanie zmian działa, wykrywając różnice między bieżącymi wartościami właściwości jednostki a oryginalnymi wartościami właściwości przechowywanymi w migawki, gdy jednostka została zapytana lub dołączona. Techniki przedstawione w tym temacie dotyczą modeli utworzonych przy użyciu podejścia „najpierw kod” i narzędzia EF Designer.
Domyślnie program Entity Framework automatycznie wykrywa zmiany, gdy są wywoływane następujące metody:
- DbSet.Find
- DbSet.Local
- DbSet.Add
- DbSet.AddRange
- DbSet.Remove
- DbSet.RemoveRange
- DbSet.Attach
- DbContext.SaveChanges
- DbContext.GetValidationErrors
- DbContext.Entry
- DbChangeTracker.Entries
Wyłączanie automatycznego wykrywania zmian
Jeśli śledzisz wiele jednostek w kontekście i wywołujesz jedną z tych metod wiele razy w pętli, możesz uzyskać znaczne ulepszenia wydajności, wyłączając wykrywanie zmian w czasie trwania pętli. Przykład:
using (var context = new BloggingContext())
{
try
{
context.Configuration.AutoDetectChangesEnabled = false;
// Make many calls in a loop
foreach (var blog in aLotOfBlogs)
{
context.Blogs.Add(blog);
}
}
finally
{
context.Configuration.AutoDetectChangesEnabled = true;
}
}
Nie zapomnij ponownie włączyć wykrywania zmian po pętli — użyliśmy próby/na koniec, aby upewnić się, że jest ona zawsze ponownie włączona, nawet jeśli kod w pętli zgłasza wyjątek.
Alternatywą dla wyłączania i ponownego włączania jest pozostawienie automatycznego wykrywania zmian wyłączonych przez cały czas i kontekstu wywołania. ChangeTracker.DetectChanges jawnie lub pilnie używaj serwerów proxy śledzenia zmian. Obie te opcje są zaawansowane i mogą łatwo wprowadzać subtelne usterki do aplikacji, aby używać ich z ostrożnością.
Jeśli musisz dodać lub usunąć wiele obiektów z kontekstu, rozważ użycie metody DbSet.AddRange i DbSet.RemoveRange. Te metody automatycznie wykrywają zmiany tylko raz po zakończeniu operacji dodawania lub usuwania.