私は、エンティティフレームワークを介してデータベース(この場合は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コードファースト
ありがとうございますが、これは私の質問には答えません。 –
EFはクライアントコードとのインターフェイスの背後に隠れています(クライアントコードに影響を与えずにストレージメカニズムを簡単にスワップする必要があるため)。そのように私はそのUOW実装を "包む"必要がありました。どのように、なぜ、そしてこれが正しいかは、あまりにも長い議論です。私は、EFがSaveChangesの前に単一のトランザクションで命令をラップすることを認識しています。私のシナリオでは、私は単一のトランザクションでラップする必要がある複数のSaveChanges呼び出しを持っています。設計を守るためではなく、もう一度 - 私はEF6トランザクションを相互に入れ子にすることができるかどうかを知りたいだけです。 –
私は自分の答えを広げました。あなたの質問にもっと役立つことを願っています。 –