SaveChanges(false)
dan AcceptAllChanges()
dalam Rangka Kerja Entiti (EF) dengan urus niagaApabila menggunakan urus niaga dalam Rangka Kerja Entiti (EF), kaedah SaveChanges()
lazimnya bertanggungjawab untuk penciptaan dan pengurusan transaksi. Dengan menghantar SaveChanges()
ke false
dan kemudian memanggil AcceptAllChanges()
apabila tiada ralat berlaku, EF memastikan bahawa perubahan yang belum selesai sama ada dilakukan dalam transaksi atau ditarik balik.
Walau bagaimanapun, pendekatan ini mungkin menyebabkan masalah dalam beberapa kes:
Kembali urus niaga:
Apabila pengecualian berlaku semasa pelaksanaan transaksi, transaksi mesti digulung semula untuk mengekalkan integriti pangkalan data. Walaupun kaedah SaveChanges(false)
AcceptAllChanges()
membenarkan pengendalian ralat tersuai, urus niaga masih akan ditamatkan selepas kaedah di luar skop. Jika ralat berlaku selepas memanggil AcceptAllChanges()
, perubahan masih akan dipaparkan dalam pangkalan data.
Lajur pengenalan: Lajur identiti dijana secara automatik dan diperuntukkan oleh pangkalan data semasa pemasukan rekod. Jika operasi sisipan gagal semasa transaksi, mungkin terdapat jurang dalam urutan identiti, yang boleh menjejaskan sisipan berikutnya.
Skop Transaksi:
Kelas TransactionScope
standard dalam .NET menyediakan fleksibiliti tambahan untuk mengurus transaksi yang diedarkan merentas pelbagai konteks. Walau bagaimanapun, ia boleh menjadi masalah dalam EF apabila menggunakan kaedah SaveChanges(false)
AcceptAllChanges()
, kerana membuang perubahan dalam satu konteks boleh menjejaskan keputusan transaksi dalam konteks lain.
Bila hendak menggunakan SaveChanges(false) dan AcceptAllChanges():
Walaupun kaveat ini, pendekatan SaveChanges(false)
AcceptAllChanges()
berfungsi paling baik dalam situasi di mana transaksi teragih merentas berbilang konteks diperlukan. Dengan mengekalkan perubahan tanpa komitmen, ia membenarkan pengendalian ralat dan pengelogan sebelum melakukan atau melancarkan transaksi.
Contoh:
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { // 对 Context1 的操作 context1.SaveChanges(false); // 对 Context2 的操作 context2.SaveChanges(false); // 事务完成,提交更改 scope.Complete(); context1.AcceptAllChanges(); context2.AcceptAllChanges(); }</code>
Dalam contoh ini, jika context1
atau context2
menghadapi ralat selepas memanggil SaveChanges(false)
, transaksi boleh ditarik balik dan perubahan tanpa komitmen untuk setiap konteks boleh dilog untuk siasatan lanjut.
Atas ialah kandungan terperinci SaveChanges (False) dan ReseptAllChanges () vs Transaksi dalam EF: Bilakah Menggunakan Yang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!