我正在使用NHibernate创建一个Windows窗体应用程序。它是一个MDI应用程序,因此用户可以同时打开多少表单(可能很多)没有限制。
对于大多数表单,我想要一个“确定”和一个“取消”按钮。两者都关闭表单,但“OK”也将修改后的数据保存到DB。表单可能非常复杂,修改可能会触及整个对象图,添加一些,删除一些,以及更改一些。如果可以根据需要自动检测和保存更改,而无需手动跟踪每个更改,那将是一件好事。
这样做的好方法是什么?
额外信息:我可以制作我想要的任何数据库架构。我正在使用MSSQL 2008,目前已经决定使用GUID主键(使用guid.comb生成器)和TIMESTAMP列来实现乐观并发。
我尝试将NHibernate FlushMode
的{{1}}设置为ISession
,根据需要进行所有修改,然后在用户点击“确定”时调用Never
。 But that didn't work.
答案 0 :(得分:1)
一些可能的解决方案,假设您每个表单实例使用一个ISession:
由于您正在使用主键的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时提交事务?