Udostępnij za pośrednictwem


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.