27

Nov

[EF] Implementare un SaveChanges transazionato (TSaveChanges)

ciao a tutti

 

è importante spesso poter lavorare su un set di dati da persistere contemporaneamente

lo scenario tipico di uso delle transazioni

 

sfortunatamente EntityFramework non dà un metodo comodo da lanciare, dovremmo andare a mano nella connessione della proprietà Database e da li creare una connessione, teoricamente, agnostica nei confronti del provider dati…

 

in alternativa, è possibile usare la comoda classe TransactionScope del namespace System.Transactions (dobbiamo aggiungere il riferimento della relativa libreria)

 

il TransactionScope gestisce transazioni dirette ai vari motori di persistenza (non supporta solo SQL, ma anche eventuali file-system, Queues, etc), andando a lavorare sia creando una “local lightweight transaction” che una eventuale “full fledged distributed transaction”, per far collaborare più sistemi tra di loro (non è questo il nostro caso)

 

a noi basta scrivere questo (ulteriore per chi ha letto il precedente post) Extension method:

public static void TSaveChanges(this DbContext context, IsolationLevel level = IsolationLevel.ReadCommitted)
{
    using (var t = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = level }))
    {
        context.SaveChanges();
        t.Complete();
    }
}

 

da poter chiamare al posto del solito SaveChanges

come parametro ho aggiunto la possibilità di specificare in modo opzionale quale contesto di isolamente andare ad utilizzare

quello scelto, è poi quello di default di SQL Server, che blocca in lettura/scrittura l’accesso alla risorsa (tabella) nel momento intercorre tra il SaveChanges ed il Complete… in pratica, il tempo che effettivamente il DB salva le righe sui suoi files

 

 

ciao a tutti

by Antonio Esposito on 11/27/2013
Post archive