【问题标题】:TransactionScope with DapperExtensions?带有 DapperExtensions 的 TransactionScope?
【发布时间】:2018-07-31 14:57:08
【问题描述】:

我想将涉及 DapperExtensions 函数的多个方法调用分组到单个事务下,这样如果任何一个失败,我可以将它们全部回滚。

这涉及对预先存在的函数的调用,其中一些函数

  • 使用 DapperExtensions 谓词,和/或
  • 使用他们自己的连接。

答案需要在单个事务下同时允许谓词调用和多个连接。

我尝试过的

到目前为止,我已经找到了两种方法,TransactionScope 和 IDbConnection。

事务范围

using (var transactionScope = new TransactionScope())
{
      // Function calls here
     transactionScope.Complete();
}

尽管据我所知,.Net Core 2.0 中应该可以使用它,但我正在使用的 Dapper 和/或 DapperExtensions 调用似乎不支持它。运行它会给我以下错误:

 "Enlisting in Ambient transactions is not supported."

我浏览了有关这是否可行或将永远可行的文档,但没有找到。

IDbTransaction

DapperExtensions 的谓词函数似乎支持这一点,但到目前为止,我找不到任何跨多个连接使用同一事务的示例。一些较早的帖子特别指出这是一种“基于连接”的事务方法,所以我不确定它是否可能。

我发现关于 DapperExtensions 的文档非常精简,所以如果有人能指出一些关于它的函数如何处理一般事务的参考资料,那也会非常有帮助!

【问题讨论】:

  • 您使用的是哪个版本的System.Data.SqlClient?似乎此问题已在 4.5.0 github.com/dotnet/corefx/issues/24282 中修复
  • @2kay 就是这样!我开始使用的项目(.Net Core 2.0)加载了对 SqlClient 的引用,但它是 4.4.0 版。我通过 NuGet 来获取最新的和 TransactionScope 现在的作品。请将此作为答案提交,我将标记为已接受。

标签: c# transactions .net-core dapper dapper-extensions


【解决方案1】:

issue 已在System.Data.SqlClient v4.5 中修复。

【讨论】:

    【解决方案2】:

    你可以这样使用它。

     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();
                        }              
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      相关资源
      最近更新 更多