.net core Dapper、.NET核心和事务失败
我们将基于Dapper的应用程序移植到.NETCore,我们的事务代码有问题 我们用“动作”来执行东西.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(字符
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();
投掷;
}
}
}