Bagikan melalui


Deteksi perubahan otomatis

Saat menggunakan sebagian besar entitas POCO, penentuan bagaimana entitas telah berubah (dan oleh karena itu pembaruan mana yang perlu dikirim ke database) ditangani oleh algoritma Deteksi Perubahan. Deteksi Perubahan bekerja dengan mendeteksi perbedaan antara nilai properti entitas saat ini dan nilai properti asli yang disimpan dalam rekam jepret saat entitas dikueri atau dilampirkan. Teknik yang ditunjukkan dalam topik ini berlaku sama untuk model yang dibuat dengan Perancang EF dan Code First.

Secara default, Kerangka Kerja Entitas melakukan Deteksi Perubahan secara otomatis saat metode berikut dipanggil:

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

Menonaktifkan deteksi perubahan otomatis

Jika Anda melacak banyak entitas dalam konteks Anda dan Anda memanggil salah satu metode ini berkali-kali dalam perulangan, maka Anda mungkin mendapatkan peningkatan performa yang signifikan dengan menonaktifkan deteksi perubahan selama durasi perulangan. Contohnya:

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

Jangan lupa untuk mengaktifkan kembali deteksi perubahan setelah perulangan — Kami telah menggunakan coba/akhirnya untuk memastikannya selalu diaktifkan kembali meskipun kode dalam perulangan melemparkan pengecualian.

Alternatif untuk menonaktifkan dan mengaktifkan kembali adalah membiarkan deteksi otomatis perubahan dinonaktifkan setiap saat dan baik konteks panggilan. ChangeTracker.DetectChanges secara eksplisit atau gunakan proksi pelacakan perubahan dengan rajin. Kedua opsi ini canggih dan dapat dengan mudah memperkenalkan bug halang ke dalam aplikasi Anda sehingga gunakan dengan hati-hati.

Jika Anda perlu menambahkan atau menghapus banyak objek dari konteks, pertimbangkan untuk menggunakan DbSet.AddRange dan DbSet.RemoveRange. Metode ini secara otomatis mendeteksi perubahan hanya sekali setelah operasi tambahkan atau hapus selesai.