Dapper,.NET Core和Transactions失败

Ben*_*Ben 3 dapper .net-core

我们将基于Dapper的应用程序移植到.NET Core,我们的事务代码存在问题.

我们使用"动作"来执行东西

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

我们使用方法来执行这些操作

    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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这适用于.NET Framework和Dapper 1.42,但在使用Dapper 1.50.2的.NET Core上失败.

System.InvalidOperationException:'ExecuteNonQuery要求命令在分配给命令的连接处于挂起的本地事务中时具有事务.该命令的Transaction属性尚未初始化.

如果我们使用它删除交易也可以.

需要改变什么来使它工作?

Ben*_*Ben 6

好吧,我们现在似乎必须明确传递事务.

    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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)