我有一个类似下面的代码的方法。我将SqlConnection
和Transaction
传递给嵌套方法。
public async Task<IdentityResult> M(Model model, CancellationToken cancellationToken,
SqlTransaction transaction = null)
{
IdentityResult result;
using (transaction = _sqlConnection.BeginTransaction())
{
try
{
result = await M1(_sqlConnection,model, cancellationToken, transaction);
if (result.Succeeded)
{
result = await M2(_sqlConnection,model,cancellationToken, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
result = GeneralErrors.Failed;
}
}
return result;
}
当编译器来到这里时:
internal async Task<IdentityResult> M1(SqlConnection connection,Model model,CancellationToken cancellationToken, SqlTransaction transaction = null)
{
using (var multi = connection.QueryMultiple(query.Query,transaction)) // Error
{
//...
}
}
当我调用QueryMultiple
方法时出现此错误:
System.InvalidOperationException:'ExecuteReader要求命令在分配给命令的连接处于挂起的本地事务中时具有事务。该命令的Transaction属性尚未初始化。
我怎样才能找出问题所在?
你打电话时
connection.QueryMultiple(query.Query,transaction)
你实际上使用QueryMultiple
扩展方法的以下重载:
GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);
如您所见,传递给QueryMultiple
调用的第二个transaction
参数不被视为事务对象,而是视为查询的param
。
要解决此问题,请明确命名transaction
参数:
using (var multi = connection.QueryMultiple(query.Query, transaction: transaction))
或显式传递param
参数的null
值:
using (var multi = connection.QueryMultiple(query.Query, null, transaction))