Varlık Çerçevesi ile çoğu zaman SaveChanges()
yeterlidir. Bu bir işlem oluşturur veya herhangi bir ortam işlemine kaydolur ve bu işlemde gerekli tüm işleri yapar.
Bazen SaveChanges(false) + AcceptAllChanges()
eşleştirme faydalı olsa da .
Bunun için en kullanışlı yer, iki farklı bağlamda dağıtılmış bir işlem yapmak istediğiniz durumlardır.
Yani böyle bir şey (kötü):
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();
}
Eğer context1.SaveChanges()
başarılı ama context2.SaveChanges()
bütün dağıtılmış işlem iptal edilir başarısız olur. Ancak ne yazık ki Entity Framework değişiklikleri zaten attı context1
, bu nedenle hatayı tekrar oynatamaz veya etkili bir şekilde kaydedemezsiniz.
Ancak kodunuzu şöyle görünecek şekilde değiştirirseniz:
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();
}
SaveChanges(false)
Veritabanına gerekli komutları gönderme çağrısı yapılırken, bağlamın kendisi değişmez, böylece gerekirse yeniden yapabilir veya isterseniz sorgulayabilirsiniz ObjectStateManager
.
Bu, işlemin gerçekten bir istisna atarsa, her bağlamın durumunu yeniden denemek veya günlüğe kaydederek telafi edebileceğiniz anlamına gelir ObjectStateManager
.
Bkz benim blog yazısı daha fazlası.
SaveChanges(fase); ... AcceptAllChanges();
, ilk etapta neden bir model olduğunu anlamama yardımcı oldu . Yukarıdaki soruya kabul edilen cevabın, bir blog yazarı tarafından nasıl yazıldığına ve bu blogun diğer soruya nasıl atıfta bulunduğuna dikkat edin. Her şey bir araya geliyor.