EF Core .AsNoTracking()
dan Penulisan Pangkalan Data: Penjelasan
Teras Rangka Kerja Entiti (Teras EF) menawarkan .AsNoTracking()
untuk mengoptimumkan pertanyaan dengan melumpuhkan penjejakan perubahan. Ini berfaedah apabila anda hanya perlu membaca data dan tidak berniat untuk mengubah suainya dalam konteks semasa. Walau bagaimanapun, kesannya pada kemas kini seterusnya memerlukan pertimbangan yang teliti.
Contoh anda menyerlahkan titik kekeliruan biasa:
Senario: Menggunakan konteks setiap permintaan, anda mula-mula mendapatkan semula pengguna dengan .AsNoTracking()
, kemudian cuba mengemas kini pengguna yang sama.
Langkah 1: context.Set<user>().AsNoTracking()
mendapatkan semula pengguna tanpa penjejakan.
Langkah 2: context.Set<user>()
cuba mengemas kini pengguna yang tidak dijejaki.
Perbezaan Penting:
Perbezaan utama antara menggunakan .AsNoTracking()
dan tidak menggunakannya terletak pada cara EF Core menguruskan keadaan entiti.
Tanpa .AsNoTracking()
: EF Core menjejaki entiti. Apabila anda mengemas kini dan menyimpan, EF Core secara automatik mengesan perubahan dan mengemas kini pangkalan data dengan sewajarnya. Ini ialah pendekatan yang lebih mudah dan mudah jika anda berhasrat untuk mengubah suai entiti.
Dengan .AsNoTracking()
: Entiti itu tidak dijejaki. EF Core tidak tahu tentang perubahan yang anda buat. Untuk mengemas kini pangkalan data, anda mesti melampirkan entiti secara eksplisit pada konteks menggunakan context.Entry(user).State = EntityState.Modified;
sebelum memanggil context.SaveChanges()
. Kegagalan berbuat demikian berkemungkinan akan menyebabkan rekod baharu dimasukkan dan bukannya rekod sedia ada dikemas kini.
Ringkasnya, .AsNoTracking()
memberikan keuntungan prestasi untuk operasi baca sahaja. Untuk operasi kemas kini, sama ada elakkan .AsNoTracking()
untuk mendapatkan semula awal atau bersedia untuk mengurus keadaan entiti secara manual dalam konteks sebelum menyimpan perubahan. Pilihan bergantung pada keperluan khusus anda dan sama ada anda mengutamakan prestasi atau kod yang lebih mudah.
Atas ialah kandungan terperinci Adakah `.AsNoTracking()` EF Core Mempengaruhi Tulisan Pangkalan Data Semasa Mengemas kini Entiti?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!