1

本质上,这是对这个问题的跟进。我开始觉得我应该放弃整个想法,但我会再试一次。

我想要的很像一个数据库事务。它应该跟踪我对数据库的更改,然后最终允许我提交或回滚它们。如果我插入一个对象,我应该在下一个(适当的)SELECT 查询中取回它。如果我删除它,未来的 SELECT 查询不应该返回它。等等。

但是有一个问题 - 这笔交易将运行很长时间。它会在用户打开表单时启动(我在这里谈论的是 Windows 表单),而提交/回滚将在用户关闭它时启动(使用 OK/Cancel)。所以它可能需要几秒钟到几天之间的任何时间。此要求排除了标准数据库事务,因为这将锁定它所触及的表/行,并且其他用户将无法使用系统。此外,事务在真正提交之前不应向数据库提交任何更改。因此,如果一个用户进行了一些更改,其他人在点击 OK 按钮之前不会看到它们。这可以防止计算机崩溃或与网络断开连接时出现错误。

如果解决方案对我的模型施加了限制,我很好(我使用的是 MSSQL 2008,顺便说一句)。我可以以任何我喜欢的方式设计数据库/代码。我也同意提交可能会失败的想法,因为有人已经修改了我的事务触及的对象之一。

有这样的吗?我查看了 NHibernate.Burrow,但我不确定那是我想要的。

补充:这是项目的开始,所以我不依赖于 NHibernate。我开始使用它,但我仍然可以轻松更改。

4

5 回答 5

3

据我判断,DataObjects.Net通过 DisconnectedState完全支持这个概念。该功能非常新(几周前发布),它的初步文档在这里DataObjects.Net 的 WPF 示例将其用于 UI 事务。

我不确定那里是否提到了它,但是 DisconnectedState 以及它的 OperationLog 可以被序列化。因此,即使应用程序重新启动,它的缓存状态也可以存活。

于 2010-03-17T00:50:11.007 回答
1

我认为没有人会在 NHibernate 核心中实现这一点,因为没有人会使用它。Viewmodel 与域模型不同。

于 2010-03-16T22:13:00.723 回答
0

这不是您问题的直接答案,但这是 WWF(必须喜欢这个名字)打算解决的问题(至少在 v 3.5 之前它没有这样做)。

于 2010-03-16T22:00:44.650 回答
0

如果您仍在关注这一点,Ayende Rahien 在 MSDN 杂志http://msdn.microsoft.com/en-us/magazine/ee819139.aspx中有一篇关于按表单/演示者方法进行会话的文章。还可以查看 NHibernate 书籍http://manning.com/kuate/的第 5章(提供示例章节),关于交易和对话的一章。

只要您延迟刷新/事务直到按下 ok 按钮,它就应该工作(取决于刷新模式)。但是完全隔离是一个困难的问题,因为在处理多个实体时,您的会话将能够访问其他会话已提交的数据。您将不得不考虑处理此类问题。

顺便说一句,如果您不使用 NHibernate,您将如何处理这种情况?

于 2010-04-12T20:27:52.407 回答
0

EclipseLink 对这种野兽的支持有限。他们称之为“符合”,并在“工作单元”上下文中实现了它。

于 2012-05-17T18:12:43.393 回答