0

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

D1 和 D2 中的每一个都在入口处创建一个TransactionScope(使用TransactionMode.New),在用户与对话框交互时修改模型对象(M1 或 M2),并在用户按下 OK/Cancel 按钮时适当地提交/回滚。

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

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

实际发生的情况是,当 D1 关闭时(以及在 D2 关闭之前),对 M1 的更改似乎确实被保存到数据库中,但 D2 看不到对 M1 的更改——大概是因为 D2 中的会话/事务认为它具有最新的对象,因此即使FindFirst调用 etc 也不会重新查询数据库。有什么方法可以强制它(不会丢失对 M2 的更改)?

(另一个奇怪的行为是 D1 和 D2 都挂在 上TransactionScope.OnCompleted,但是只有在 D2 关闭时才会在 D1 上触发,因为从 D2 调用 D1 的情况。)

4

1 回答 1

0

好的,我想我找到了一些可行的方法,但它有点难看,所以我仍然对任何更好的答案感兴趣。

诀窍是修改 D1,这样当它被嵌套调用时,在提交自己的事务(并因此返回 D2 的事务范围)之后,重新Find修改它刚刚修改的对象和Refresh它们。

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

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

于 2011-08-03T06:54:16.343 回答