Problema de transacción Dapper.net

asp.net dapper orm sql-server-2008

Pregunta

Estoy intentando realizar una transacción en mi base de datos de Sql Server 2008: en primer lugar, dos insertos seguidos por un par de actualizaciones; sin embargo, tan pronto como intenta ejecutar la primera de las actualizaciones, aparece el siguiente error:

ExecuteNonQuery requiere que el comando tenga una transacción cuando la conexión asignada al comando se encuentra en una transacción local pendiente. La propiedad de Transacción del comando no se ha inicializado.

Aquí está el código, editado ligeramente por brevedad:

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

Las primeras 2 inserciones funcionan bien, pero tan pronto como intenta realizar una de las actualizaciones, no hay alegría.

Respuesta aceptada

He encontrado el problema: simplemente me faltaba el parámetro de transacción cuando estaba llamando a las actualizaciones, mientras que con las inserciones previas que funcionaban bien, ¡había incluido el param IDbTransaction ! ¡Mi error!

Ejemplo:

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

Respuesta popular

Microsoft recomienda usar TransactionScope sobre la base de datos IDbTransaction cuando sea posible. El siguiente código debería funcionar, suponiendo que nada está mal con su SQL y el proveedor administrado automáticamente se enlista en la transacción ambiental, algo que los proveedores de buen comportamiento deben hacer.

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

  ts.complete();
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué