嵌套UI需要ActiveRecord中的嵌套事务

时间:2011-08-03 02:42:03

标签: .net activerecord transactions castle-activerecord nested-transactions

我有一个对话框D1,它编辑模型类型M1,另一个对话框D2编辑模型类型M2。 M2包含的内容之一是对M1的引用,因此为方便用户D2包含启动D1的按钮,此外D1和D2都可从顶层访问。

D1和D2中的每一个在条目上创建TransactionScope(使用TransactionMode.New),在用户与对话框交互时修改模型对象(M1或M2),并在适当时提交/回滚用户按下确定/取消按钮。

当从顶层打开对话框时,这可以很好地隔离。

当D1从D2内打开时,预期的行为是在D1中单击OK应该立即保存到数据库,然后M1中的更改​​应该对D2可见。 (D2然后可以保存或取消自己对M2的更改而不影响M1。)

实际发生的事情是,当D1关闭时(以及D2关闭之前),对M1的更改似乎会保存到数据库中,但是D2无法看到对M1的更改 - 可能是因为会话/事务处于D2认为它具有最新的对象,因此即使调用FindFirst等,也不会重新查询数据库。有没有办法强制它(不会丢失对M2的更改)?

(另一个奇怪的行为是D1和D2都挂钩到TransactionScope.OnCompleted,但是当D2从D2调用D1时,这只会在D1关闭时触发。)

1 个答案:

答案 0 :(得分:0)

好吧,我想我发现了一些有用的东西,但它有点难看,所以我仍然对任何更好的答案感兴趣。

诀窍是修改D1,使得当它被调用嵌套时,在提交自己的事务(从而返回到D2的事务范围)之后,重新Find它刚修改的对象{{1}他们。

它可以检测到它在这个嵌套场景中,因为RefreshOnCompleted自己的事务时没有被调用。

(这个解决方案的一个问题是,它可能不适用于三层嵌套方案,除非最内层可以将其修改对象列表一直传递到最外层,这真的很难看幸运的是,在我的情况下,我只需要两层。)