Qual è il modo corretto di utilizzare BeginTransaction()
con IDbConnection
in Dapper?Modo corretto di utilizzare BeginTransaction con Dapper.IDbConnection
Ho creato un metodo in cui devo usare BeginTransaction()
. Ecco il codice.
using (IDbConnection cn = DBConnection)
{
var oTransaction = cn.BeginTransaction();
try
{
// SAVE BASIC CONSULT DETAIL
var oPara = new DynamicParameters();
oPara.Add("@PatientID", iPatientID, dbType: DbType.Int32);
..........blah......blah............
}
catch (Exception ex)
{
oTransaction.Rollback();
return new SaveResponse { Success = false, ResponseString = ex.Message };
}
}
Quando ho eseguito metodo di cui sopra - ho ottenuto un'eccezione -
Operazione non valida. La connessione è chiusa.
Questo perché non è possibile iniziare una transazione prima che la connessione venga aperta. Quindi quando aggiungo questa riga: cn.Open();
, l'errore viene risolto. Ma ho letto da qualche parte che l'apertura manuale della connessione è una cattiva pratica !! Dapper apre una connessione solo quando è necessario.
In Entity framework è possibile gestire una transazione utilizzando uno TransactionScope
.
Quindi la mia domanda è che cosa è una buona pratica per gestire la transazione senza aggiungere la riga cn.Open()...
in Dapper? Immagino che ci dovrebbe essere un modo corretto per questo.
FFR: questo è stato suggerito ma rifiutato come PR :(https://github.com/StackExchange/dapper-dot-net/pull/429 Marc ha anche partecipato al discussione, è stato rifiutato principalmente perché c'è già una duplicazione tra sync/async - l'aggiunta di metodi di estensione per le transazioni comporterebbe la duplicazione di tutti i metodi 4 volte –
@ marc-gravell - Nel caso del rollback, devi chiamare esplicitamente ' tran.RollBack'? è la transazione non ripristinata automaticamente a disposizione? – MaYaN