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

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

4

2 回答 2

12

好的

我创建了一个示例应用程序,例如我在数据库中检查的问题和后记中的示例,并且没有添加任何用户。

结论: ObjectContext.SaveChange 它自动成为一个事务。

注意:我相信如果执行 sprocs 等,将需要事务。

于 2009-07-01T17:40:56.183 回答
8

我相信(但我不是 EF 方面的长期专家)在对 context.SaveChanges 的调用通过之前,事务不会开始。我希望该调用的异常会自动回滚它启动的任何事务。替代方案(如果您想控制交易)[来自J.Lerman 的“编程实体框架” O'Reilly,第 1 页。第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();
    }
  }

}
于 2009-07-01T16:34:47.390 回答