2017-04-21 3 views
2

Dapperベースのアプリケーションを.NET Coreに移植し、トランザクションコードに問題があります。Dapper、.NET CoreおよびTransactionsが失敗する

我々はもの

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とDapperの1.42と素晴らしい作品が、それは上の失敗でそれらのアクションを実行するためのメソッドを使用.NET Core with 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; 
      } 
     } 
    } 
関連する問題