3

2つの異なるコードを統合して同じトランザクションを使用しようとしています。1つはOracle上のEntityFramework(odp.netをドライバーとして使用)で、もう1つはodp.netを使用する標準のado.netを使用しています。どちらも同じ接続文字列を使用しています。

これを達成する正しい方法は何でしょうか?

context.Connection.BeginTransaction()を使用してEFトランザクションを開始できますが、System.Data.Common.DbTransactionが返されます。

odp.netで直接使用できますか?DTCに関連するすべての問題があるため、TransactionScopeは使用しないことをお勧めします。

EFを使用してこのストアドプロシージャにアクセスできない理由はさまざまです(現時点では、EF用にカスタムメイドのT4テンプレートを使用しており、ストアドプロシージャをサポートしていません)。

4

1 に答える 1

3

さて、私はそれを理解しました。

これが私がすることです:

エンティティフレームワークを使用する前に、次のことを行います。

Context.Connection.Open();
var ts = Context.Connection.BeginTransaction();

次に、EFオブジェクトを使用して、SaveChanges()を呼び出します。

ADO.NETの場合、次のことを行います(単なる例であり、製品コードではありません!)。

   var conn = ((EntityConnection)dal.Context.Connection).StoreConnection;

   var cmd2 = conn.CreateCommand();
   cmd2.CommandText = "insert into tst_rob values ('3')";
   cmd2.ExecuteNonQuery();

キャッチは、Context.ConnectionをEntityConnectionにキャストして、基になる接続に到達できるようにすることでした。

最後に、ts.Commit()またはts.Rollback()のいずれかを実行します。出来上がり、DTCは関与せず、すべて同じトランザクションにあります。

于 2013-01-10T13:29:43.700 に答える