Dapper.net交易问题

mar*_*nes 13 asp.net orm sql-server-2008 dapper

我正在尝试将事务提交到我的Sql Server 2008数据库 - 首先是2次插入然后是几次更新,但是,一旦它尝试执行第一次更新,我就会收到以下错误:

当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery要求命令具有事务.该命令的Transaction属性尚未初始化.

这是代码,为简洁起见略有编辑:

using (_cn)
{
    _cn.Open();
    IDbTransaction transaction = _cn.BeginTransaction();
    topicId = (int)_cn.Query<decimal>(qAddTopic, new { pForumId = topic.ForumId }, transaction).Single();
    postId = (int)_cn.Query<decimal>(qAddPost, new { pTopicId = topicId }, transaction).Single();

    _cn.Execute(qUpdateForums, new { pLastPostId = postId });
    _cn.Execute((qUpdateSiteTotals));

    transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)

前2个插入工作正常,但只要它尝试执行其中一个更新,就没有快乐.

mar*_*nes 20

我发现了问题 - 当我调用更新时,我只是错过了事务参数,而以前的插入工作正常,我已经包含了IDbTransaction参数!我的错!

例:

Connection.Query<Entitiy>("sqlQuery",param: new { id= ID}, transaction: Transaction)
Run Code Online (Sandbox Code Playgroud)


Oli*_*old 5

Microsoft建议尽可能使用TransactionScope而不是数据库IDbTransaction.以下代码应该有效,假设您的SQL没有任何问题,托管提供程序会自动登记在环境事务中 - 这是行为良好的提供程序需要做的事情.

using (var ts = new TransactionScope())
{
  using (_cn)
  {
    _cn.Open();
    ...
  }

  ts.complete();
}
Run Code Online (Sandbox Code Playgroud)

  • Dapper对交易绝对不可知.我将TransactionScope与Dapper结合使用,绝对没有问题. (4认同)