如何回滚在实体框架事务(How to rollback a transaction in Entit

2019-06-24 16:36发布

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

或者,也许这是自动完成的,这意味着如果发生错误,提交更改的所有更改取消。 是吗?

Answer 1:

我创建添加喜欢从问题和后记我在DB检查,没有用户的示例应用程序的样本。

结论:ObjectContext.SaveChange,将自动交易。

注:我相信将需要交易,如果执行存储过程等。



Answer 2:

我相信,(但我在EF时间不长专家)直到调用context.SaveChanges获得通过,本次交易未启动。 我希望可以调用一个异常将自动回滚它启动的任何交易。 替代品(如果你想在交易的控制)从J.Lerman的“编程实体框架” O'Reilly的,页。 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();
    }
  }

}


文章来源: How to rollback a transaction in Entity Framework