Saya telah menyelidiki transaksi dan tampaknya bahwa mereka mengurus diri sendiri di EF selama saya lulus false
untuk SaveChanges()
dan kemudian memanggil AcceptAllChanges()
jika ada kesalahan:
SaveChanges(false);
// ...
AcceptAllChanges();
Bagaimana jika ada yang tidak beres? tidakkah saya harus mengembalikan atau, begitu metode saya keluar dari ruang lingkup, apakah transaksi berakhir?
Apa yang terjadi pada kolom indenty yang ditugaskan setengah jalan melalui transaksi? Saya kira jika orang lain menambahkan catatan setelah saya sebelum saya menjadi buruk maka ini berarti akan ada nilai Identitas yang hilang.
Apakah ada alasan untuk menggunakan TransactionScope
kelas standar dalam kode saya?
c#
entity-framework
transactions
tandai pandai besi
sumber
sumber
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.Jawaban:
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):
Jika
context1.SaveChanges()
berhasil tetapicontext2.SaveChanges()
gagal seluruh transaksi yang didistribusikan dibatalkan. Namun sayangnya, Entity Framework telah membuang perubahancontext1
, sehingga Anda tidak dapat memutar ulang atau mencatat kegagalan secara efektif.Tetapi jika Anda mengubah kode Anda menjadi seperti ini:
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 menginterogasiObjectStateManager
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.
sumber
SaveChanges(false)
melakukan pembaruan aktual ke basis data, sambilAcceptAllChanges()
memberi tahu EF, "Oke, Anda bisa melupakan hal-hal yang perlu disimpan, karena semuanya berhasil disimpan." JikaSaveChanges(false)
gagal,AcceptAllChanges()
tidak akan pernah dipanggil dan EF akan tetap menganggap objek Anda memiliki properti yang diubah dan perlu disimpan kembali ke database.Jika Anda menggunakan EF6 (Entity Framework 6+), ini telah berubah untuk panggilan basis data ke SQL.
Lihat: http://msdn.microsoft.com/en-us/data/dn456843.aspx
gunakan context.Database.BeginTransaction.
Dari MSDN:
sumber
throw;
potongan MSDN dan menunjukkan dengan jelas bahwa itu bukan asli dari artikel MSDN.Rollback()
disebut kalau-kalau itu berbicara dengan MySql atau sesuatu yang tidak memiliki perilaku otomatis itu.Karena beberapa basis data dapat melempar pengecualian di dbContextTransaction.Commit () jadi ini lebih baik:
sumber
false
masukcontext.SaveChanges();
, dan juga meneleponcontext.AcceptAllChanges();
.