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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
Comment puis-je gérer correctement cette histoire de transaction ?
Edit : message d'erreur complet
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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...
Merci![]()
Partager