Transaction sur Requêtes Entities et Requêtes SQL pures
Bonjour,
j'écris actuellement un code (Procédure stockée), qui lit en Linq Entities des données d'une base A, et va écrire dans une base B en LinqEntities et en Requêtes SQL classiques (avec SQLConnexion, SQLCommand et tout le tralala).
Voulant sécuriser la transaction de migration de données, j'avais encapsulé mes appels dans un TransactionScope, de telle manière :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
Context context1 = new Context(ConnexionLocale);
Context context2 = new Context(ConnexionDistante);
using(TransactionScope tscope = new TransactionScope())
{
SQLConnection cnx = new SQLConnection(ConnexionDistante2);
//Lecture avec context1
//Ecriture avec context2
//Requete SQL INSERT avec cnx
context1.saveChanges();
context2.saveChanges();
cnx.Close();
tscope.Complete();
} |
L'appel au premier SaveChanges me lève une exception, comme quoi la transactoion a déjà été commit ou rollback, j'ai donc enlevé le transactionScope, mais maintenant si un souci avec la requête Linq se produit, mes données traitées avec cnx persistent, et je perds mon intégrité de données.
Comment puis-je gérer correctement cette histoire de transaction ?
Edit : message d'erreur complet
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| System.Data.EntityException: The underlying provider failed on Open. ---> System.Transactions.TransactionException: The transaction has already been implicitly or explicitly committed or aborted. ---> System.Runtime.InteropServices.COMException: La transaction a déjà été validée ou annulée de manière implicite ou explicite (Exception de HRESULT : 0x8004D00E)
System.Runtime.InteropServices.COMException:
at System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] whereabouts, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer)
at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
System.Transactions.TransactionException:
at System.Transactions.Oletx.OletxTransactionManager.ProxyException(COMException comException)
at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
at System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction, Byte[] whereAbouts)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnec
...
System.Data.EntityException:
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionO... |
The underlying provider failed on Open == il ne peut pas instancier car une transaction serait ouverte ? Y aurait-il un moyen de transmettre le scope à l'entity ?
Merci :)