使用Db Transactions"连接的实体框架5已经是本地或分布式事务的一部分"

时间:2014-12-11 22:26:27

标签: entity-framework transactions entity-framework-5

我对交易和实体框架5没有任何好运。我有以下代码:

 context.Database.Connection.Open();
 transaction = context.Database.Connection.BeginTransaction(IsolationLevel.Serializable);
//some work happens
context.SaveChanges();
//some additional work
context.SaveChanges();
transaction.Commit();

在第一个context.SaveChanges调用时,我得到一个例外:" Connection已经是本地或分布式事务的一部分"

现在我实际上只是在做一个简单的概念证明,我所做的就是附加一个实体,将其标记为已修改,然后调用保存更改。

作为一个故障排除协议,我在连接状态发生变化并在那里有一个断点时放入一个事件处理程序。这样做,我验证了在我启动事务和调用save更改之间的连接没有关闭。

任何帮助,弄清楚为什么它给我这个例外将非常感激。

2 个答案:

答案 0 :(得分:1)

这是我们之前使用交易的方式。它对我们有用:

public void DoSomething()
{
   using (var db = GetContext())
   {
        using (var ts = GetTransactionScope())
        {
            //do stuff
            db.SaveChanges();
            ts.Complete();
        }
   }
}

public TransactionScope GetTransactionScope()
{
    var tso = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
    return new TransactionScope(TransactionScopeOption.Required, tso);
}

答案 1 :(得分:0)

如果出于某种原因,您必须在一个事务中执行多个SaveChanges调用,建议的方法是将它们包装在TransactionScope中:

using(var tran = new TransactionScope())
{
    using(var context = new MyContext())
    {
        //some work happens
        context.SaveChanges();
        //some additional work
        context.SaveChanges();
    }

    tran.Complete(); // without this call the transaction is rolled back.
}

default isolation level is serializable。在事务中打开的每个连接都在此事务中登记。默认情况下,EF始终在执行查询时打开和关闭连接。

我想你得到的这个异常的原因是EF在执行SaveChanges时自己创建了一个事务对象。它尝试使用其连接来启动此事务,但该连接已经是您创建的事务的一部分。通过使用TransactionScope,EF事务只是参与环境事务。