c# - باستخدام المعاملات أو SaveChanges(خطأ) و AcceptAllChanges()؟




entity-framework transactions (2)

إذا كنت تستخدم EF6 (Entity Framework 6+) ، فقد تغير ذلك لمكالمات قاعدة البيانات إلى SQL.
انظر: http://msdn.microsoft.com/en-us/data/dn456843.aspx

استخدم context.Database.BeginTransaction.

من MSDN:

using (var context = new BloggingContext()) 
{ 
    using (var dbContextTransaction = context.Database.BeginTransaction()) 
    { 
        try 
        { 
            context.Database.ExecuteSqlCommand( 
                @"UPDATE Blogs SET Rating = 5" + 
                    " WHERE Name LIKE '%Entity Framework%'" 
                ); 

            var query = context.Posts.Where(p => p.Blog.Rating >= 5); 
            foreach (var post in query) 
            { 
                post.Title += "[Cool Blog]"; 
            } 

            context.SaveChanges(); 

            dbContextTransaction.Commit(); 
        } 
        catch (Exception) 
        { 
            dbContextTransaction.Rollback(); //Required according to MSDN article 
            throw; //Not in MSDN article, but recommended so the exception still bubbles up
        } 
    } 
} 

لقد تم التحقيق في المعاملات ويبدو أنهم يعتنون بأنفسهم في EF طالما تمرير false إلى SaveChanges() ثم استدعاء AcceptAllChanges() حالة عدم وجود أخطاء:

SaveChanges(false);
// ...
AcceptAllChanges();

ماذا لو ساء شيء ما؟ لا يجب علي التراجع ، أو بمجرد انتهاء الطريقتين ، هل انتهت المعاملة؟

ماذا يحدث لأي أعمدة indentiy التي تم تعيينها في منتصف الطريق من خلال الصفقة؟ أفترض إذا كان شخص آخر أضاف سجلاً بعد كتابي قبل أن أتعرض لسيئتي فهذا يعني أن هناك قيمة مفقودة للهوية.

هل هناك أي سبب لاستخدام الطبقة TransactionScope القياسية في الكود الخاص بي؟


لأن بعض قواعد البيانات يمكن أن تطرح استثناء في dbContextTransaction.Commit () حتى أفضل هذا:

using (var context = new BloggingContext()) 
{ 
  using (var dbContextTransaction = context.Database.BeginTransaction()) 
  { 
    try 
    { 
      context.Database.ExecuteSqlCommand( 
          @"UPDATE Blogs SET Rating = 5" + 
              " WHERE Name LIKE '%Entity Framework%'" 
          ); 

      var query = context.Posts.Where(p => p.Blog.Rating >= 5); 
      foreach (var post in query) 
      { 
          post.Title += "[Cool Blog]"; 
      } 

      context.SaveChanges(false); 

      dbContextTransaction.Commit(); 

      context.AcceptAllChanges();
    } 
    catch (Exception) 
    { 
      dbContextTransaction.Rollback(); 
    } 
  } 
} 






transactions