0

モデル タイプ M1 を編集するダイアログ D1 と、モデル タイプ M2 を編集する別のダイアログ D2 があります。M2 に含まれるものの 1 つは M1 への参照であるため、ユーザーの利便性のために、D1 と D2 の両方にトップレベルからアクセスできることに加えて、D2 には D1 を起動するボタンが含まれています。

D1 と D2 はそれぞれ、入力時にTransactionScope(を使用してTransactionMode.New) を作成し、ユーザーがダイアログを操作するとモデル オブジェクト (M1 または M2) を変更し、ユーザーが [OK]/[キャンセル] ボタンを押すと、必要に応じてコミット/ロールバックします。

ダイアログが最上位から開かれている場合、これは単独で正常に機能します。

D1 を D2 内から開いた場合、D1 で [OK] をクリックするとすぐにデータベースに保存され、M1 での変更が D2 に表示されるという動作が期待されます。(その後、D2 は、M1 に影響を与えることなく、M2 への独自の変更を保存またはキャンセルできます。)

実際に起こっていることは、D1 が閉じるとき (および D2 が閉じる前) に M1 への変更がデータベースに保存されているように見えますが、D2 は M1 への変更を認識できないということです。おそらく、D2 のセッション/トランザクションが最新のオブジェクトがあるため、FindFirstetc が呼び出された場合でも、データベースを再クエリしません。(M2への変更を失うことなく)それを強制する方法はありますか?

(別の奇妙な動作は、D1 と D2 の両方が にフックすることTransactionScope.OnCompletedですが、これは、D1 が D2 から呼び出された場合に D2 が閉じられている場合にのみ D1 で起動します。)

4

1 に答える 1

0

わかりました、うまくいくものを見つけたと思いますが、少し醜いので、もっと良い答えにまだ興味があります.

秘訣は、D1 がネストされて呼び出されたときに、それ自身のトランザクションをコミットした後 (それによって D2 のトランザクション スコープに戻った後)、Find変更したばかりのオブジェクトとRefreshそれらを再設定するように D1 を変更することでした。

また、独自のトランザクションを作成しOnCompletedたときに呼び出されなかったため、このネストされたシナリオにあることを検出できます。Dispose

(このソリューションの問題の 1 つは、最も内側のレイヤーが変更されたオブジェクトのリストを最も外側のレイヤーに渡すことができない限り、おそらく 3 レイヤーのネスティング シナリオでは機能しないということです。私の場合、必要なレイヤーは 2 つだけでした。)

于 2011-08-03T06:54:16.343 に答える