0

我有一個編輯模型類型M1的對話框D1和編輯模型類型M2的另一個對話框D2。 M2包含的內容之一是對M1的引用,並且爲了便於用戶D2包含啓動D1的按鈕,除了可以從頂層訪問D1和D2之外。在ActiveRecord中需要嵌套事務的嵌套UI

D1和D2中的每一個在輸入時創建TransactionScope(使用TransactionMode.New),當用戶與對話交互時修改模型對象(M1或M2),並在用戶按下確定/取消時適當提交/回滾鈕釦。

從頂層打開對話框時,此功能可以很好地工作。

當從D2內打開D1時,預期的行爲是單擊D1中的確定應立即保存到數據庫,然後M1中的更改​​應該對D2可見。 (D2然後可以保存或取消自己的M2的變化不影響M1)

什麼實際發生的是,改變M1似乎D1關閉時將得到保存到數據庫(與前D2關閉),但D2無法看到對M1的更改 - 大概是因爲D2中的會話/事務認爲它具有最新的對象,因此不會重新查詢數據庫,即使調用了FindFirst等也是如此。有沒有辦法強制它(不失去對M2的改變)?

(另一個奇怪的現象是,無論D1 & D2鉤上TransactionScope.OnCompleted,但D1這隻火災時,D2被關閉時,D1從D2叫的情況。)

回答

0

好吧,我想我我發現了一些有用的東西,但它有點難看,所以我仍然對任何更好的答案感興趣。

訣竅是修改D1,這樣當它被稱爲嵌套的,提交其自己的事務(從而返回到D2的事務範圍內)後,重新Find它剛剛修改的對象和Refresh他們。

它可以檢測到它在這個嵌套的場景中,因爲OnCompleted在它自己的事務中沒有被調用。

(這個解決方案的一個問題是它可能不適用於三層嵌套場景,除非最內層可以將其修改對象的列表一直傳遞到最外層,好在我的情況下,我只需要兩層。)