Dalam Rangka Kerja Entiti (EF), pengurusan transaksi biasanya hanya memerlukan operasi manual paling sedikit. Dengan lulus palsu kepada SaveChanges (), rangka kerja itu akan ditubuhkan atau mengambil bahagian dalam urus niaga. Selepas pelaksanaan yang berjaya, AcceptallChanges () akan mengemukakan dan menyelesaikan perubahan dalam transaksi.
Walau bagaimanapun, beberapa senario mungkin mendapat manfaat daripada menggunakan saveChanges (false) dan reseptAllChanges () pada masa yang sama. Kelebihan utama mereka ialah ia melibatkan urusan yang diedarkan yang melibatkan pelbagai konteks.
pertimbangkan kod kod berikut:
Jika Context1.SaveChanges () gagal berjaya melaksanakan, Context2.SaveChanges () gagal, keseluruhan transaksi yang diedarkan akan digantung. Malangnya, EF telah membuang perubahan dalam Context1 dan tidak dapat pulih atau mencatatkan kesilapan dengan berkesan.
<code>using (TransactionScope scope = new TransactionScope()) { // 对 context1 执行操作 // 对 context2 执行操作 // 保存并丢弃更改 context1.SaveChanges(); // 保存并丢弃更改 context2.SaveChanges(); // 如果执行到这里,则一切看起来都很正常。 scope.Complete(); }</code>
Untuk menyelesaikan masalah ini, sila gunakan kaedah yang diubah suai berikut:
Pengubahsuaian ini hanya membolehkan kedua -dua konteks untuk menyerahkan perubahan mereka hanya selepas urus niaga berjaya. Jika keabnormalan berlaku, perubahan akan disimpan dalam objekStateManager di atas dan di bawah untuk pemprosesan selanjutnya, seperti cuba semula atau rekod log.
<code>using (TransactionScope scope = new TransactionScope()) { // 对 context1 执行操作 // 对 context2 执行操作 // 保存更改,但不要立即丢弃 context1.SaveChanges(false); // 保存更改,但不要立即丢弃 context2.SaveChanges(false); // 如果执行到这里,则一切看起来都很正常。 scope.Complete(); context1.AcceptAllChanges(); context2.AcceptAllChanges(); }</code>
Atas ialah kandungan terperinci SaveChanges(false) dan AcceptAllChanges() dalam EF: Bilakah Anda Harus Menggunakannya untuk Transaksi Teragih?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!