0

モデルタイプM1を編集するダイアログD1とモデルタイプM2を編集する別のダイアログD2があります。 M2に含まれるものの1つはM1への参照であり、ユーザD2の便宜として、D1を起動するボタンと、D1とD2の両方がトップレベルからアクセス可能である。ActiveRecordでネストされたトランザクションを必要とするネストされたUI

それぞれD1およびD2は、入力時にTransactionScopeTransactionMode.Newを使用)を作成し、ユーザーがダイアログと対話するときにモデルオブジェクト(M1またはM2)を変更し、ユーザーがOK/Cancelを押したときに適宜コミット/ボタン。

これは、ダイアログボックスが最上位から開かれているときに、分離して正常に機能します。

D1をD2内から開くと、D1のOKをクリックするとすぐにデータベースに保存され、M1の変更がD2に表示されるはずです。 (D2はM1に影響を与えずにM2への変更を保存またはキャンセルできます)

実際には、D1の終了時(D2終了前)はM1への変更がデータベースに保存されているようですが、 D2はM1の変更を見ることはできません。おそらく、D2のセッション/トランザクションは最新のオブジェクトを持っていると考えているので、FindFirstなどが呼ばれてもデータベースを再クエリーしません。強制的に(M2への変更を失うことなく)何らかの方法がありますか?

(D2がD1をD2から呼び出された場合のために閉鎖されたときにもう一つの奇妙な行動がTransactionScope.OnCompletedへのそのD1 & D2フックの両方ですが、D1でこののみ発生します。)

答えて

0

[OK]を、私は」だと思います何かを見つけましたが、それは少し醜いので、私はまだどんな良い答えにも興味があります。

トリックは、ネストされたときに、独自のトランザクションをコミットした後(D2のトランザクションスコープに戻った)D1を変更して、変更したオブジェクトを再度Findに変更し、Refreshとしました。

OnCompletedは、それ自身のトランザクションDisposeが呼び出されていないため、このネストされたシナリオにあることを検出できます。

(この解決策の問題の1つは、最も内側のレイヤーが最も外側のレイヤーに変更されたオブジェクトのリストをすべて渡すことができない限り、おそらく3レイヤーの入れ子シナリオでは機能しないということです。醜いです。幸い私の場合、私は2つの層しか必要としませんでした。)

関連する問題