实质上,这是this question的后续行动。我开始觉得我应该放弃整个想法,但我会再给它一次。
我想要的就像数据库交易一样。它应该跟踪我对数据库的更改,然后最终允许我提交或回滚它们。如果我插入一个对象,我应该在我的下一个(适当的)SELECT查询中找回它。如果我删除它,将来的SELECT查询不应该返回它。等
但是有一个问题 - 这个交易将会持续很长时间。它将在用户打开表单时启动(我在这里谈论Windows窗体),并且提交/回滚将在用户关闭它时(使用“确定/取消”)。所以它可能需要几秒到几天。此要求排除了标准数据库事务,因为这会锁定它触及的表/行,而其他用户将无法使用该系统。此事务在实际提交之前不应对数据库进行任何更改。因此,如果一个用户进行了一些更改,其他用户只有在按下OK按钮后才会看到它们。这可以防止计算机崩溃或断开网络连接时出现错误。
如果解决方案对我的模型施加约束(我正在使用MSSQL 2008,顺便说一句),我很好。我可以按照自己喜欢的方式设计DB /代码。我也认为提交可能会失败,因为有人已经修改了我的交易触及的其中一个对象。
有这样的事吗?我看了NHibernate.Burrow,但我不确定那是我想要的。
已添加:这是项目的开始,所以我不依赖于NHibernate。我开始使用它,但我仍然可以轻松改变。
答案 0 :(得分:3)
据我所知,DataObjects.Net通过DisconnectedState支持这个概念。该功能非常新(仅在几周前发布),其初步文档为here。 WPF sample for DataObjects.Net将其用于UI事务。
我不确定是否在那里提到它,但是DisconnectedState以及它的OperationLog可以被序列化。因此,即使应用程序重新启动,其缓存状态也可以存活。
答案 1 :(得分:1)
我认为没有人会在NHibernate核心中实现这一点,因为没有人会使用它。 Viewmodel与域模型的模型不同。
答案 2 :(得分:0)
这不是你问题的直接答案,但这就是WWF(必须爱这个名字)的目的是解决这个问题(而不是至少在第3.5节这样做)。
答案 3 :(得分:0)
如果您仍在关注此事,Ayende Rahien在MSDN杂志http://msdn.microsoft.com/en-us/magazine/ee819139.aspx中有一篇关于每个表单/演示者方法的会话的文章。另请参阅NHibernate书籍http://manning.com/kuate/的第5章(可用的样本章节),关于交易和对话的书。
只要你按下刷新/交易,直到按下确定按钮,它就应该工作(取决于冲洗模式)。但完全隔离是一个困难的问题,因为您的会话将能够访问其他会话在处理多个实体时提交的数据。你将不得不考虑处理这些问题。
顺便说一句,如果你不使用NHibernate,你将如何处理这种情况?
答案 4 :(得分:0)
EclipseLink对这种野兽的支持有限。他们称之为“符合”,并且他们在“工作单元”背景下实施了它。