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.
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.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.