Automatická detekce změn

Při použití většiny entit POCO se určuje, jak se entita změnila (a proto které aktualizace je potřeba odeslat do databáze), zpracovává algoritmus Zjistit změny. Detekce změn funguje tak, že zjistí rozdíly mezi aktuálními hodnotami vlastností entity a původními hodnotami vlastností, které jsou uloženy ve snímku při dotazování nebo připojení entity. Techniky uvedené v tomto tématu jsou rovnocenné pro modely vytvořené pomocí Code First a EF Designeru.

Ve výchozím nastavení Entity Framework provádí funkci Detect Changes automaticky, pokud jsou volány následující metody:

  • DbSet.Find
  • DbSet.Local
  • DbSet.Add
  • DbSet.AddRange
  • DbSet.Remove
  • DbSet.RemoveRange
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

Zakázání automatické detekce změn

Pokud ve smyčce sledujete mnoho entit a často voláte jednu z těchto metod ve smyčce, můžete dosáhnout výrazného zlepšení výkonu vypnutím detekce změn po dobu trvání smyčky. Příklad:

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;
    }
}

Nezapomeňte znovu povolit detekci změn po smyčce – použili jsme akci/závěr, abychom zajistili, že je vždy znovu povolená, i když kód ve smyčce vyvolá výjimku.

Alternativou k zakázání a opětovnému povolení je ponechání automatické detekce změn vypnutých za všech okolností a kontext volání. ChangeTracker.DetectChanges explicitně nebo používejte proxy servery pro sledování změn pečlivě. Obě tyto možnosti jsou pokročilé a můžou do aplikace snadno zavádět drobné chyby, takže je používejte opatrně.

Pokud potřebujete přidat nebo odebrat mnoho objektů z kontextu, zvažte použití DbSet.AddRange a DbSet.RemoveRange. Tyto metody automaticky rozpoznávají změny pouze jednou po dokončení operací přidání nebo odebrání.