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.