Saya punya pertanyaan tentang .AsNoTracking()
ekstensi, karena ini semua cukup baru dan cukup membingungkan.
Saya menggunakan konteks per permintaan untuk situs web.
Banyak entitas saya tidak berubah jadi tidak perlu dilacak, tetapi saya memiliki skenario berikut di mana saya tidak yakin apa yang terjadi pada basis data, atau bahkan apakah itu membuat perbedaan dalam kasus ini.
Contoh ini adalah apa yang saya lakukan saat ini:
context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Ini sama seperti di atas tetapi menghapus .AsNoTracking()
dari Langkah 1:
context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Langkah 1 & 2 menggunakan konteks yang sama tetapi terjadi pada waktu yang berbeda. Apa yang tidak bisa saya lakukan adalah apakah ada perbedaan. Karena Langkah 2 adalah pembaruan, saya kira keduanya akan mengenai database dua kali.
Adakah yang bisa memberi tahu saya apa perbedaannya?
sumber
lihat halaman ini Kerangka Entitas dan AsNoTracking
Apa yang AsNoTracking Lakukan
Entity Framework memaparkan sejumlah opsi penyesuaian kinerja untuk membantu Anda mengoptimalkan kinerja aplikasi Anda. Salah satu opsi penyetelan ini adalah
.AsNoTracking()
. Pengoptimalan ini memungkinkan Anda memberi tahuEntity Framework
untuk tidak melacak hasil kueri. Ini berarti bahwaEntity Framework
tidak melakukan pemrosesan atau penyimpanan tambahan dari entitas yang dikembalikan oleh permintaan. Namun, itu juga berarti bahwa Anda tidak dapat memperbarui entitas ini tanpa menempelkannya kembali ke grafik pelacakan.ada keuntungan kinerja signifikan yang bisa didapat dengan menggunakan AsNoTracking
sumber
Tidak Ada Pelacakan LINQ ke kueri Entitas
Penggunaan AsNoTracking () disarankan ketika kueri Anda dimaksudkan untuk operasi baca. Dalam skenario ini, Anda mendapatkan kembali entitas Anda tetapi mereka tidak dilacak oleh konteks Anda. Ini memastikan penggunaan memori minimal dan kinerja optimal
Info lebih lanjut tersedia di sini:
Pertimbangan kinerja untuk Kerangka Entitas
Kerangka Entitas dan NoTracking
sumber
Menonaktifkan pelacakan juga akan menyebabkan hasil Anda disetel ke dalam memori. Ini lebih efisien ketika Anda bekerja dengan set data besar dan tidak perlu seluruh set data sekaligus.
Referensi:
sumber
AsNoTracking () memungkinkan persyaratan "kunci unik per catatan" di EF dilewati (tidak disebutkan secara eksplisit oleh jawaban lain).
Ini sangat membantu ketika membaca Tampilan yang tidak mendukung kunci unik karena mungkin beberapa bidang dapat dibatalkan atau sifat tampilan tidak dapat diindeks secara logis.
Untuk kasus ini, "kunci" dapat disetel ke kolom yang tidak dapat dibatalkan tetapi AsNoTracking () harus digunakan dengan setiap kueri catatan lain (duplikat dengan kunci) akan dilewati.
sumber
Jika Anda memiliki sesuatu yang lain mengubah DB (katakan proses lain) dan perlu memastikan Anda melihat perubahan ini, gunakan
AsNoTracking()
, jika tidak EF dapat memberi Anda salinan terakhir dari konteks Anda sebagai gantinya, maka itu baik untuk biasanya menggunakan konteks baru setiap permintaan :http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/
sumber