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在它自己的事务中没有被调用。

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