Dengan Kerangka Entitas sebagian besar waktu SaveChanges()
sudah cukup. Ini menciptakan transaksi, atau mendaftar dalam setiap transaksi ambient, dan melakukan semua pekerjaan yang diperlukan dalam transaksi itu.
Kadang-kadang meskipun SaveChanges(false) + AcceptAllChanges()
berpasangan berguna.
Tempat yang paling berguna untuk ini adalah dalam situasi di mana Anda ingin melakukan transaksi terdistribusi di dua Konteks yang berbeda.
Yaitu sesuatu seperti ini (buruk):
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save and discard changes
context1.SaveChanges();
//Save and discard changes
context2.SaveChanges();
//if we get here things are looking good.
scope.Complete();
}
Jika context1.SaveChanges()
berhasil tetapi context2.SaveChanges()
gagal seluruh transaksi yang didistribusikan dibatalkan. Namun sayangnya, Entity Framework telah membuang perubahan context1
, sehingga Anda tidak dapat memutar ulang atau mencatat kegagalan secara efektif.
Tetapi jika Anda mengubah kode Anda menjadi seperti ini:
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save Changes but don't discard yet
context1.SaveChanges(false);
//Save Changes but don't discard yet
context2.SaveChanges(false);
//if we get here things are looking good.
scope.Complete();
context1.AcceptAllChanges();
context2.AcceptAllChanges();
}
Sementara panggilan untuk SaveChanges(false)
mengirim perintah yang diperlukan ke database, konteksnya sendiri tidak berubah, jadi Anda bisa melakukannya lagi jika perlu, atau Anda bisa menginterogasi ObjectStateManager
jika Anda mau.
Ini berarti jika transaksi benar-benar melempar pengecualian yang dapat Anda kompensasi, dengan mencoba kembali atau mencatat status dari setiap konteks di ObjectStateManager
suatu tempat.
Lihat posting blog saya untuk lebih lanjut.
SaveChanges(fase); ... AcceptAllChanges();
ada pola pada awalnya. Perhatikan bagaimana jawaban yang diterima untuk pertanyaan di atas, ditulis oleh penulis blog - dan blog itu direferensikan dalam pertanyaan lain. Semuanya datang bersamaan.