带有 DapperExtensions 的 TransactionScope?
TransactionScope with DapperExtensions?
我想将涉及 DapperExtensions 函数的多个方法调用分组在一个事务下,这样我可以在任何一个失败时回滚所有方法。
这涉及调用预先存在的函数,其中一些函数
- 使用 DapperExtensions 谓词,and/or
- 使用他们自己的连接。
答案需要在单个事务下同时允许谓词调用和多个连接。
我试过的
到目前为止,我发现了两种方法,TransactionScope 和 IDbConnection。
交易范围
using (var transactionScope = new TransactionScope())
{
// Function calls here
transactionScope.Complete();
}
尽管据我所知这应该在 .Net Core 2.0 中可用,但它似乎不受我正在使用的 Dapper and/or DapperExtensions 调用的支持。 运行 这给了我以下错误:
"Enlisting in Ambient transactions is not supported."
我浏览了有关这是否可行或将永远可行的文档,但一无所获。
IDbTransaction
DapperExtensions 的谓词函数似乎支持这一点,但到目前为止,我找不到任何跨多个连接使用同一事务的示例。一些较旧的帖子明确指出这是一种 "connection-based" 事务方法,所以我不确定它是否可能。
我发现关于 DapperExtensions 的文档非常精简,所以如果有人能给我指出一些关于它的函数通常如何处理事务的参考资料,那也会非常有帮助!
此 issue 已在 System.Data.SqlClient v4.5
中修复。
你可以这样使用它。
using (var sqlConnection = new SqlConnection(configuration.GetConnectionString("DefaultConnection")))
{
sqlConnection.Open();
using (var tx = sqlConnection.BeginTransaction())
{
var model = await sqlConnection.GetListAsync<T>(transaction:tx);
return model.ToList();
}
}
我想将涉及 DapperExtensions 函数的多个方法调用分组在一个事务下,这样我可以在任何一个失败时回滚所有方法。
这涉及调用预先存在的函数,其中一些函数
- 使用 DapperExtensions 谓词,and/or
- 使用他们自己的连接。
答案需要在单个事务下同时允许谓词调用和多个连接。
我试过的
到目前为止,我发现了两种方法,TransactionScope 和 IDbConnection。
交易范围
using (var transactionScope = new TransactionScope())
{
// Function calls here
transactionScope.Complete();
}
尽管据我所知这应该在 .Net Core 2.0 中可用,但它似乎不受我正在使用的 Dapper and/or DapperExtensions 调用的支持。 运行 这给了我以下错误:
"Enlisting in Ambient transactions is not supported."
我浏览了有关这是否可行或将永远可行的文档,但一无所获。
IDbTransaction
DapperExtensions 的谓词函数似乎支持这一点,但到目前为止,我找不到任何跨多个连接使用同一事务的示例。一些较旧的帖子明确指出这是一种 "connection-based" 事务方法,所以我不确定它是否可能。
我发现关于 DapperExtensions 的文档非常精简,所以如果有人能给我指出一些关于它的函数通常如何处理事务的参考资料,那也会非常有帮助!
此 issue 已在 System.Data.SqlClient v4.5
中修复。
你可以这样使用它。
using (var sqlConnection = new SqlConnection(configuration.GetConnectionString("DefaultConnection")))
{
sqlConnection.Open();
using (var tx = sqlConnection.BeginTransaction())
{
var model = await sqlConnection.GetListAsync<T>(transaction:tx);
return model.ToList();
}
}