我有一个编辑模型类型 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 的情况。)