Aracılığıyla paylaş


Değişiklikleri otomatik algılama

ÇOĞU POCO varlığı kullanılırken, bir varlığın nasıl değiştiğinin belirlenmesi (ve bu nedenle veritabanına hangi güncelleştirmelerin gönderilmesi gerektiği) Değişiklikleri Algıla algoritması tarafından işlenir. Değişiklikleri Algıla varlığın geçerli özellik değerleri ile varlık sorgulandığında veya eklendiğinde anlık görüntüde depolanan özgün özellik değerleri arasındaki farkları algılayarak çalışır. Bu konu başlığında gösterilen teknikler, gerek Code First gerekse EF Designer ile oluşturulan modellere için geçerlidir.

Varsayılan olarak, Entity Framework aşağıdaki yöntemler çağrıldığında Değişiklikleri Algıla işlemini otomatik olarak gerçekleştirir:

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

Değişiklikleri otomatik algılamayı devre dışı bırakma

Bağlamınızdaki çok sayıda varlığı izliyorsanız ve bu yöntemlerden birini döngü içinde birçok kez çağırırsanız, döngü süresince değişiklikleri algılamayı kapatarak önemli performans iyileştirmeleri elde edebilirsiniz. Örnek:

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

Döngüden sonra değişikliklerin algılanmasını yeniden etkinleştirmeyi unutmayın— Döngüdeki kod bir özel durum oluştursa bile her zaman yeniden etkinleştirildiğinden emin olmak için bir try/finally kullandık.

Devre dışı bırakmanın ve yeniden etkinleştirmenin bir alternatifi, değişiklikleri otomatik algılamayı her zaman ve çağrı bağlamını kapalı bırakmaktır. ChangeTracker.DetectChanges açıkça veya değişiklik izleme proxy'lerini özenle kullanın. Bu seçeneklerin her ikisi de gelişmiştir ve uygulamanıza kolayca ince hatalar ekleyebilir, bu nedenle bunları dikkatli kullanın.

Bir bağlamda çok sayıda nesne eklemeniz veya kaldırmanız gerekiyorsa, DbSet.AddRange ve DbSet.RemoveRange kullanmayı göz önünde bulundurun. Bu yöntemler, ekleme veya kaldırma işlemleri tamamlandıktan sonra değişiklikleri yalnızca bir kez otomatik olarak algılar.