如何在Entity Framework中回滾事務

c# entity-framework rollback savechanges transactions

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.
    }

或者這可能是自動完成的,這意味著如果發生錯誤,則會針對所有更改取消提交更改。是嗎?

一般承認的答案

我創建了一個示例應用程序,例如問題中的示例,然後我在數據庫中檢查並且沒有添加任何用戶。

結論:ObjectContext.SaveChange它自動成為一個事務。

注意:我相信如果執行sprocs等將需要事務。


熱門答案

我相信(但我不是EF的專家),在調用context.SaveChanges之前,事務沒有開始。我希望該調用的異常會自動回滾它啟動的任何事務。替代方案(如果你想控制交易)[來自J.Lerman的“編程實體框架” O'Reilly,pg。 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();
    }
  }

}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因