stored framework c# dapper

c# - framework - transacción con dapper dot net



dapper vs entity framework (5)

Me gustaría ejecutar múltiples instrucciones de inserción en varias tablas. Estoy usando dapper.net. No veo ninguna forma de manejar transacciones con dapper.net.

Por favor comparta sus ideas sobre cómo usar transacciones con dapper.net.


Aquí el fragmento de código:

using System.Transactions; .... using (var transactionScope = new TransactionScope()) { DoYourDapperWork(); transactionScope.Complete(); }

Tenga en cuenta que debe agregar una referencia al ensamblado System.Transactions porque no se hace referencia a él por defecto.


Debería poder usar TransactionScope ya que Dapper solo ejecuta comandos ADO.NET.

using (var scope = new TransactionScope()) { // insert // insert scope.Complete(); }


La respuesta de Daniel funcionó como esperaba. Para completar, aquí hay un fragmento que muestra la confirmación y la retrotracción utilizando un ámbito de transacción y un dapper:

using System.Transactions; // _sqlConnection has been opened elsewhere in preceeding code using (var transactionScope = new TransactionScope()) { try { long result = _sqlConnection.ExecuteScalar<long>(sqlString, new {Param1 = 1, Param2 = "string"}); transactionScope.Complete(); } catch (Exception exception) { // Logger initialized elsewhere in code _logger.Error(exception, $"Error encountered whilst executing SQL: {sqlString}, Message: {exception.Message}") // re-throw to let the caller know throw; } } // This is where Dispose is called


Preferí usar un enfoque más intuitivo obteniendo la transacción directamente de la conexión:

// This method will get a connection, and open it if it''s not yet open. using (var connection = GetOpenConnection()) using (var transaction = connection.BeginTransaction()) { connection.Execute( "INSERT INTO data(Foo, Bar) values (@Foo, @Bar);", listOf5000Items, transaction); transaction.Commit(); }


Teniendo en cuenta que todas sus tablas están en una única base de datos, no estoy de acuerdo con la solución TransactionScope sugerida en algunas respuestas aquí. Refiere this respuesta.

  1. TransactionScope generalmente se usa para transacciones distribuidas; las transacciones que abarcan diferentes bases de datos pueden estar en sistemas diferentes. Esto necesita algunas configuraciones en el sistema operativo y SQL Server sin el cual esto no funcionará. Esto no se recomienda si todas sus consultas están en contra de una sola instancia de la base de datos.

  2. connection.BeginTransaction es la sintaxis de ADO.NET para implementar la transacción (en C #, VB.NET, etc.) en una única base de datos. Esto no funciona en múltiples bases de datos.

Entonces, connection.BeginTransaction() es una mejor forma de hacerlo.

Incluso la mejor forma de manejar la transacción es implementar UnitOfWork como se explica en this respuesta.