Dapper, .NET Core y las transacciones fallan

.net-core dapper

Pregunta

Transmitimos nuestra aplicación basada en Dapper a .NET Core y tenemos un problema con nuestro código de transacción.

Usamos "acciones" para ejecutar cosas

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

Y usamos métodos para ejecutar esas acciones con

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

Esto funciona muy bien con .NET Framework y Dapper 1.42, pero falla en .NET Core con Dapper 1.50.2.

System.InvalidOperationException: 'ExecuteNonQuery requiere que el comando tenga una transacción cuando la conexión asignada al comando se encuentra en una transacción local pendiente. La propiedad de Transacción del comando no se ha inicializado. '

Si eliminamos la transacción, también funciona bien.

¿Qué debe cambiar para que funcione?

Respuesta aceptada

Ok, parece que ahora tenemos que pasar la transacción explícitamente.

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué