Dapper.net problema di transazione

asp.net dapper orm sql-server-2008

Domanda

Sto provando a commettere una transazione nel mio database Sql Server 2008 - in primo luogo 2 inserimenti seguiti da un paio di aggiornamenti, tuttavia, non appena tenta di eseguire il primo degli aggiornamenti, ottengo il seguente errore:

ExecuteNonQuery richiede che il comando abbia una transazione quando la connessione assegnata al comando si trova in una transazione locale in sospeso. La proprietà Transaction del comando non è stata inizializzata.

Ecco il codice, leggermente modificato per brevità:

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

I primi 2 inserti funzionano bene, ma non appena si tenta di eseguire uno degli aggiornamenti, nessuna gioia.

Risposta accettata

Ho trovato il problema: mi mancava semplicemente il param della transazione quando stavo chiamando gli aggiornamenti, mentre con gli inserti precedenti che funzionavano bene, avevo incluso il parametro IDbTransaction ! Colpa mia!

Esempio:

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

Risposta popolare

Microsoft consiglia di utilizzare TransactionScope sul database IDbTransaction quando possibile. Il seguente codice dovrebbe funzionare, partendo dal presupposto che non c'è niente di sbagliato nel tuo SQL e il provider gestito si arresta automaticamente nella transazione ambientale - qualcosa che i provider ben educati devono fare.

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

  ts.complete();
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché