2016-05-13 24 views
3

私は、エンティティフレームワークを介してデータベース(この場合はSQL Azure)を更新するさまざまな方法で、作業単位パターンを利用するコマンドサービスクラスを持っています。EF6ネストされたトランザクション

コマンドサービスは、選択したDIフレームワークで管理されているdbcontextのインスタンスへの参照でインスタンス化されます。コマンドサービスクラスのメソッドの

いくつかは、たとえば、トランザクション内のデータベースに複数の更新をラップ:

public void UpdateStuff(someEntity) 
{ 
    using(var tx = _db.Database.BeginTransaction()) 
    { 
     //Some updates to db 
     _db.SaveChanges(); 
     //Some other updates to db 
     _db.SaveChanges(); 
     tx.Commit(); 
    } 
} 

、これらの方法のうちのいくつかは、そのトランザクション内からのコマンドクラスの他のメソッドを呼び出して、

public void UpdateWithSomeCascadingStuff(someOtherEntity) 
{ 
    using(var tx = _db.Database.BeginTransaction()) 
    { 
     //Some updates to db 
     _db.SaveChanges(); 

     //Some other cascading logic and updates to db 
     var relatedEntityToUpdate = _query.GetSomeEntityToUpdate(someOtherEntity); 
     UpdateStuff(relatedEntityToUpdate); 
     _db.SaveChanges(); 
     tx.Commit(); 
    } 
} 

明らかに、これを行うことで、同じDbContextインスタンスのEFトランザクションをネストします。

これはサポートされていますか?何か問題が発生しますか?私が取ることのできる代替アプローチはありますか?

UPDATE: 私はEF6コードファースト

答えて

1

を使用していますEntityFrameworkのDBContextsは、それ自体でのUnitOfWorkとリポジトリパターンの両方を実装しています。

EF6のコンテキストは、トランザクション内のすべてのコミットも自動的に(それがすでに存在しない場合)自動的にラップします。

いいえ、複数の作業単位間でコンテキストを共有しないでください。彼らはそれぞれ自分自身を取得する必要があります。

UPDATE

あなたが同じDbContext上で重複するトランザクションを開始しようとした場合、あなたが得る:

An unhandled exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll 

Additional information: The connection is already in a transaction and cannot participate in another transaction. EntityClient does not support parallel transactions. 

ありませんので、あなたが求めているものを行うことはできません。

+0

ありがとうございますが、これは私の質問には答えません。 –

+1

EFはクライアントコードとのインターフェイスの背後に隠れています(クライアントコードに影響を与えずにストレージメカニズムを簡単にスワップする必要があるため)。そのように私はそのUOW実装を "包む"必要がありました。どのように、なぜ、そしてこれが正しいかは、あまりにも長い議論です。私は、EFがSaveChangesの前に単一のトランザクションで命令をラップすることを認識しています。私のシナリオでは、私は単一のトランザクションでラップする必要がある複数のSaveChanges呼び出しを持っています。設計を守るためではなく、もう一度 - 私はEF6トランザクションを相互に入れ子にすることができるかどうかを知りたいだけです。 –

+1

私は自分の答えを広げました。あなたの質問にもっと役立つことを願っています。 –

関連する問題