我们将基于 Dapper 的应用程序移植到 .NET Core,我们的事务代码存在问题。
我们用"行动"来执行东西
public Action<IDbConnection> CreateAction(string statement, object values)
{
return (dbConnection) => dbConnection.Execute(statement, values);
}
我们使用方法来执行这些动作
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;
}
}
}
这很适合。NET Framework和Dapper 1.42,但它在。净芯带Dapper 1.50.2。
系统。InvalidOperationException:“当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery要求命令具有事务。命令的Transaction属性尚未初始化。
如果我们使用它删除事务,它也可以正常工作。
需要改变什么才能使其正常工作?
好的,看来我们现在必须显式传递事务。
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;
}
}
}