Проблема с транзакцией Dapper.net

asp.net dapper orm sql-server-2008

Вопрос

Я пытаюсь совершить транзакцию с моей базой данных Sql Server 2008 - сначала две вставки, за которыми следует обновление пары, однако, как только она пытается выполнить первое обновление, я получаю следующую ошибку:

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

Первые 2 вставки работают нормально, но как только он пытается выполнить одно из обновлений, нет радости.

Принятый ответ

Я нашел проблему - я просто пропустил параметр транзакции, когда я вызывал обновления, тогда как с предыдущими вставками, которые работали нормально, я включил параметр IDbTransaction ! Виноват!

Пример:

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

Популярные ответы

Microsoft рекомендует использовать TransactionScope по сравнению с IDbTransaction базы данных, когда это возможно. Следующий код должен работать, предполагая, что с вашим SQL и управляемым провайдером ничего не получится автоматически заручиться внешней транзакцией - то, что должны делать хорошие сотрудники.

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

  ts.complete();
}


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему