如何用(N)Hibernate完成这项工作?

时间:2010-03-15 14:27:30

标签: winforms nhibernate hibernate

我正在使用NHibernate创建一个Windows窗体应用程序。它是一个MDI应用程序,因此用户可以同时打开多少表单(可能很多)没有限制。

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

这样做的好方法是什么?

额外信息:我可以制作我想要的任何数据库架构。我正在使用MSSQL 2008,目前已经决定使用GUID主键(使用guid.comb生成器)和TIMESTAMP列来实现乐观并发。

我尝试将NHibernate FlushMode的{​​{1}}设置为ISession,根据需要进行所有修改,然后在用户点击“确定”时调用NeverBut that didn't work.

3 个答案:

答案 0 :(得分:1)

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

  1. 如果用户取消,请致电ISession.Clear。
  2. 将FlushMode设置为Commit,仅在用户单击OK时启动事务。
  3. 坚持使用手动FlushMode original approach。它应该工作,你所看到的行为不是一个错误。
  4. 由于您正在使用主键的GUID,因此您不应该遇到意外刷新会话的NH问题,因为它需要数据库来生成标识符。您仍然需要了解NH可能在选择之前刷新以确保一致结果的情况。

    我认为您不必担心打开和关闭数据库连接。我的理解是NH非常善于管理它。

答案 1 :(得分:1)

这应该有所帮助:NHibernate Best Practices with ASP.NET, 1.2nd Ed.(我知道它是ASP.NET,但你应该发现这些信息很有用并且很容易转移到WinForms。)

简而言之,应该选择每个窗口架构的sesson。无法为同一个确切的任务打开两个不同的窗口是有道理的。然后,您可能希望在Form_Load()上创建NHibernate ISession API的实例。最后,如果用户单击OK,那么只需要BeginTransaction(),Flush()会话和Commit()事务,否则将其回滚。

答案 2 :(得分:0)

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