.net core Dapper、.NET核心和事务失败

.net core Dapper、.NET核心和事务失败,.net-core,dapper,.net Core,Dapper,我们将基于Dapper的应用程序移植到.NETCore,我们的事务代码有问题 我们用“动作”来执行东西 public Action<IDbConnection> CreateAction(string statement, object values) { return (dbConnection) => dbConnection.Execute(statement, values); } public操作CreateAction(字符

我们将基于Dapper的应用程序移植到.NETCore,我们的事务代码有问题

我们用“动作”来执行东西

    public Action<IDbConnection> CreateAction(string statement, object values)
    {
        return (dbConnection) => dbConnection.Execute(statement, values);
    }
public操作CreateAction(字符串语句、对象值)
{
return(dbConnection)=>dbConnection.Execute(语句、值);
}
我们使用方法来执行这些操作

    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;
            }
        }
    }
public void Execute(IEnumerable操作)
{
使用(IDbConnection=OpenConnection())
使用(IDbTransaction=connection.BeginTransaction())
{
尝试
{
foreach(行动中的var行动)
{
动作(事务连接);
}
Commit();
}
抓住
{
transaction.Rollback();
投掷;
}
}
}
这在.NET Framework和Dapper 1.42中非常有效,但在使用Dapper 1.50.2的.NET Core中失败

System.InvalidOperationException:“当分配给命令的连接处于挂起的本地事务中时,ExecuteOnQuery要求命令具有事务。命令的事务属性尚未初始化。'

如果我们使用它删除事务,它也可以正常工作


需要进行哪些更改才能使其正常工作?

好的,看来我们现在必须显式地传递事务

    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;
            }
        }
    }
public void Execute(IEnumerable操作)
{
使用(IDbConnection=OpenConnection())
使用(IDbTransaction=connection.BeginTransaction())
{
尝试
{
foreach(行动中的var行动)
{
动作(事务、连接、事务);
}
Commit();
}
抓住
{
transaction.Rollback();
投掷;
}
}
}