TransactionScope ed Entity Framework

Io non so se sia dovuto a delle incompatibilità note, ma non a me :), se sia un problema della mia configuarazione che non riesco a capire, o qualsiasi altra cosa, ma quando uso il TransactionScope con EntityFramework ottengo sempre una eccezione con questo messaggio.

System.Data.EntityException: The underlying provider failed on EnlistTransaction

La mia configurazione attuale prevede due Windows Server 2003 sp2 uno con l'Application Server e l'altro col DB Sql Server 2005 entrambi col DTC attivato e con privilegi di accesso alla rete.

Non ho approfondito ulteriormente la situazione perchè comunque questa eccezione mi ha fatto capire che usando il TrasactionScope ogni nuova connessione aperta, anche se riferita alla stessa connessione, viene auto-promossa a distribuita e nella mia situazione non voglio che questo accada, non avendo, almeno per ora, necessità di transazioni distribuite.

Entity Framework apre e chiude una connessione ogni volta che ne ha bisogno. Se si avesse la necessità di usare un TransactionScope, per qualsiasi motivio, ma non si vuole la promozione delle transazioni a distribuite, è sufficiente gestire manualmente l'aprtura della connessione al DB; ovvero si dovrà aprire la connessione all'inizio dello scope di transazione ed utilizzare sempre quella per tutte le operazioni, per chiuderla solo alla fine.

using(TransactionScope ts = new TransactionScope()) { connection.Open(); //do operations //... //... ts.Complete(); connection.Close(); }

 

Matteo

 

Print | posted @ lunedì 15 dicembre 2008 11:33

Comments on this entry:

Gravatar # re: TransactionScope ed Entity Framework
by Davide at 15/12/2008 13:12

Ciao,
grosso problema quello del TransactionScope, soprattutto quando usi le transazioni nello strato "Business" in cui non hai modo di sapere quante connessioni verranno usate perchè non dovresti nemmeno sapere se stai usando o meno un database! In questi casi (io l'ho risolto per LinqToSql, ma penso che per EF sia lo stesso) ho utilizzato un trucchettino, vale a dire utilizzare un ContextProvider che crea un Context solo se nel thread e nella transazione corrente non ne è stato ancora creato uno. Il Context è quello che internamente apre e chiude la connessione; in questo modo, avendo un solo Context nella transazione, si risolve il problema dell'enlist e dell'escalation al DTC.

Ciao,
Davide
Comments have been closed on this topic.