2017-04-21 2 views
2

Wir portieren unsere Dapper-Anwendung auf .NET Core und wir haben ein Problem mit unserem Transaktionscode.Dapper, .NET Core und Transaktionen scheitern

Wir verwenden "Aktionen" stuff

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

auszuführen Und wir verwenden Methoden diese Aktionen mit

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

Dies funktioniert gut mit .NET Framework und Dapper 1.42, auszuführen aber es funktioniert nicht auf .NET Core mit Dapper 1.50.2.

System.InvalidOperationException: 'ExecuteNonQuery erfordert, dass der Befehl eine Transaktion ausführt, wenn die dem Befehl zugewiesene Verbindung in einer ausstehenden lokalen Transaktion ist. Die Transaction-Eigenschaft des Befehls wurde nicht initialisiert.

Wenn wir die Transaktion entfernen, funktioniert es auch gut.

Was muss geändert werden, damit es funktioniert?

Antwort

5

Ok, es scheint, wir müssen jetzt die Transaktion explizit übergeben.

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