2017-04-21 127 views
2

我们将基于Dapper的应用程序移植到.NET Core,并且我们的事务代码存在问题。Dapper,.NET核心和事务失败

我们用“行动”来执行的东西

public Action<IDbConnection> CreateAction(string statement, object values) 
    { 
     return (dbConnection) => dbConnection.Execute(statement, values); 
    } 

而且我们使用的方法与

public void Execute(IEnumerable<Action<IDbConnection>> actions) 
    { 

     using (IDbConnection connection = OpenConnection()) 
     using (IDbTransaction transaction = connection.BeginTransaction()) 
     { 
      try 
      { 
       foreach (var action in actions) 
       { 
        action(transaction.Connection); 
       } 
       transaction.Commit(); 
      } 
      catch 
      { 
       transaction.Rollback(); 
       throw; 
      } 
     } 
    } 

这个伟大的工程与.NET Framework和小巧玲珑1.42执行这些行动,但它不能在.NET核心与Dapper 1.50.2。

System.InvalidOperationException:'ExecuteNonQuery需要该命令在分配给该命令的连接处于未决本地事务时执行事务。该命令的Transaction属性尚未初始化。'

如果我们删除使用它的交易也很好。

需要改变以使其工作?

回答

5

好吧,我们现在似乎必须明确地通过事务。

public void Execute(IEnumerable<Action<IDbConnection, IDbTransaction>> actions) 
    { 
     using (IDbConnection connection = OpenConnection()) 
     using (IDbTransaction transaction = connection.BeginTransaction()) 
     { 
      try 
      { 
       foreach (var action in actions) 
       { 
        action(transaction.Connection, transaction); 
       } 
       transaction.Commit(); 
      } 
      catch 
      { 
       transaction.Rollback(); 
       throw; 
      } 
     } 
    }