كيفية التراجع عن الصفقة في إطار الكيان
-
21-08-2019 - |
سؤال
string[] usersToAdd = new string[] { "asd", "asdert", "gasdff6" };
using (Entities context = new Entities())
{
foreach (string user in usersToAdd)
{
context.AddToUsers(new User { Name = user });
}
try
{
context.SaveChanges(); //Exception thrown: user 'gasdff6' already exist.
}
catch (Exception e)
{
//Roll back all changes including the two previous users.
}
أو ربما يتم ذلك تلقائيا, بمعنى أنه إذا حدث الخطأ وارتكاب التغييرات إلغاء كل التغييرات.الأمر ؟
المحلول
طيب
أنا خلقت عينة تطبيق مثل المثال من السؤال و تعمل تحققت في DB و لا تم إضافة المستخدمين.
الخلاصة:ObjectContext.SaveChange تلقائيا الصفقة.
ملاحظة: أعتقد المعاملات سوف تكون هناك حاجة إذا المنفذة sprocs.... الخ
نصائح أخرى
وأعتقد (ولكن أنا لست خبيرا فترة طويلة في EF) أنه حتى الدعوة إلى context.SaveChanges يمر، لم يتم بدء المعاملة. أتوقع أن استثناء من تلك الدعوة الاستعادة تلقائيا أي معاملة بدأت. البدائل (في حال كنت تريد أن تكون في السيطرة على المعاملات) [من "برمجة إطار الكيان" J.Lerman لو> أورايلي، ص. 618]
using (var transaction = new System.Transactions.TransactionScope())
{
try
{
context.SaveChanges();
transaction.Complete();
context.AcceptAllChanges();
}
catch(OptimisticConcurrencyException e)
{
//Handle the exception
context.SaveChanges();
}
}
أو
bool saved = false;
using (var transaction = new System.Transactions.TransactionScope())
{
try
{
context.SaveChanges();
saved = true;
}
catch(OptimisticConcurrencyException e)
{
//Handle the exception
context.SaveChanges();
}
finally
{
if(saved)
{
transaction.Complete();
context.AcceptAllChanges();
}
}
}
لا تنتمي إلى StackOverflow