2010. július 28., szerda

Entity Framework és SqlTransaction

Ha EF használata mellett szeretnénk egy tranzakcióba tenni EF műveleteket és ADO.NET SQL lekérdezéseket, akkor szembesülhetünk azzal a problémával, hogy nem találunk triviálisan használható kapcsolati és tranzakciós objektumokat.
Az EF EntityConnection-t és ehhez kapcsolódó EntityTransactiont használ. (Ezek a szabványos DbConnection és DbTransaction osztályokból származnak), az SQL query-khez pedig SqlConnection és SqlTransaction kellene.

Connection:
Ez a könnyebbik dolog. Fogjuk az EF DataContextjét, és a Connection objektumának a 'StoreConnection' property-je alatt megtaláljuk az SqlConnection-t. (Alapból DbConnection, de ha SQL servert használunk, akkor SqlConnection példányt találunk itt.)

System.Data.EntityClient.EntityConnection ec = (System.Data.EntityClient.EntityConnection)Context.Connection;
SqlConnection conn = (SqlConnection)ec.StoreConnection;


Transaction:
Ez a nehezebbik, mivel ugyan itt is létezik a 'StoreTransaction' property az EntityTransaction-ön belül, de PRIVATE!
Alapos guglizás után sem találtam semmilyen megoldást ennek kinyerésére, így maradt a Reflection.

_sqlTransaction = (SqlTransaction)_transaction.GetType().GetProperty("StoreTransaction", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(_transaction, new object[] { });

Nincsenek megjegyzések:

Megjegyzés küldése