2010-03-15 59 views
2

我正在用NHibernate创建一个windows窗体应用程序。这是一个MDI应用程序,因此用户可以同时打开多少个表单(可能很多)没有限制。这怎么能用(N)Hibernate完成?

对于大多数表格,我想要“确定”和“取消”按钮。两者都关闭表单,但“确定”也将修改的数据保存到数据库。这些表单可能非常复杂,而且这些修改可能会触及整个对象图形,添加一些对象,删除一些对象,并更改一些对象。如果可以根据需要自动检测并保持更改,而不需要手动跟踪每个更改,那就太好了。

什么是一个很好的方法来做到这一点?

其他信息:我可以制作任何我想要的数据库模式。我正在使用MSSQL 2008,目前已经决定了GUID主键(带有guid.comb生成器)和一个TIMESTAMP列以实现乐观并发。

我想简单地设置一个NHibernate的ISessionNeverFlushMode,做所有的修改需要,然后调用Flush()如果用户点击OK。 But that didn't work.

回答

0

也许如果你在事务中包装整个事物并在用户单击确定时提交事务?

+0

并且在用户使用表单工作的整个过程中让交易保持打开状态?想想锁定! – 2010-03-15 14:48:39

1

一些可能的解决方案,假设你使用每个表单实例一个的Isession:

  1. 呼叫如果用户取消ISession.Clear。
  2. 将FlushMode设置为Commit并仅在用户单击确定时启动事务。
  3. 坚持使用手动FlushMode的original approach。它应该工作,你看到的行为不是一个错误。

由于您使用的是主键的GUID,所以您不应该遇到NH意外刷新会话的问题,因为它需要数据库来生成标识符。您仍然需要了解在选择之前NH可能会冲洗的情况,以确保结果一致。

我不认为你需要担心打开和关闭数据库连接。我的理解是NH在管理这个方面非常好。

+0

如果这不是一个错误,那么我应该如何解决它?因为用户创建对象的时间(比如,通过在gridview中添加一行)以及修改对象的时间并不相关(只要他愿意,他可能会回来)。我应该在什么时候保存()新的对象?我应该手动跟踪所有新对象,并且只有在单击确定后才能“保存()”它们? – 2010-03-15 14:57:11

+0

这不是一个错误,因为它的行为如记录:http://knol.google.com/k/fabio-maulo/nhibernate-chapter-9/1nr4enxv3dpeq/12#9%282E%296%282E%29%28C2%29 %28A0%29Flush。当对象处于可以插入数据库的状态时,应该调用'Save()'。 NHibernate可能会推迟插入,直到'Flush()',或者在生成的ID的情况下,它可能会立即插入。如果用户可以添加/更改/删除网格中的行,那么我会等到他们单击确定找出需要插入的行。这取决于应用程序。 – 2010-03-15 15:34:38

+0

@Jamie Ide - 呃,确切地说。我必须自己跟踪肮脏。或者至少插入我猜。顺便说一句 - 你的意思是有记录的?我没有看到直接或间接提及的那种特定行为。 – 2010-03-15 19:42:27

1

这应有助于:NHibernate Best Practices with ASP.NET, 1.2nd Ed.(我知道这是ASP.NET,但你应该找到有用的信息,并很容易转移到的WinForms)

总之,应该选择每个窗口架构的雪村。无法为相同的确切任务打开两个不同的窗口在这里很有意义。然后,你可能想要在Form_Load()上创建一个NHibernate ISession API的实例。最后,如果用户单击确定,则只需执行BeginTransaction(),Flush()会话和Commit()事务,否则将其回滚。

+0

坏主意。 NHibernate事务只是ADO.NET事务的简单包装。你能想象如果一个交易在用户使用表单时始终保持打开状态会发生什么?它会锁定多少个数据库表? – 2010-03-15 14:58:46

+1

你是对的,那么我真正的意思是保持会话开放,没有活动的事务。但是每次从数据库加载或写入数据库时​​,都需要通过事务来完成。我编辑了我的答案,以反映我的意思。 – 2010-03-15 16:35:09