如何在长期存在的Windows窗体应用程序中管理NHibernate会话?

Ewa*_*ace 10 nhibernate

我们正在使用NHibernate来管理复杂的模块化Windows窗体应用程序中的持久性 - 但是一个想法一直困扰着我.我们目前在启动时打开一个会话,并通过该会话打开所有对象.我担心所有加载的对象都被加载到NHibernate会话缓存中,因此它们不能被垃圾收集,最终我们最终将整个数据库放在内存中.

Web应用程序永远不会发生这种情况,因为网页请求(甚至更好的Ajax请求)代表了完美的短期事务,因此可以打开和关闭会话来处理每个请求.

但是,如果我在表单应用程序中加载一个对象树然后放入屏幕上的导航窗格,它们可能会在应用程序的生命周期内保留它们 - 并且在任何时候用户都可以单击它们,导致我们的代码需要将对象关系导航到其他对象(仅在NHibernate会话中工作).

StackOverflow读者如何在没有我描述的问题的情况下保持NHibernate的好处?

Bru*_*pes 1

我可以看到几个替代方案:

  1. 急切加载对象树(根据我从文档中收集到的信息,这是默认值)
  2. 分离对象,拦截“单击”事件,然后使用新会话从数据库加载数据。这迫使你自己处理集合,而不是依赖nhibernate,这可能超出了问题的范围(要求NHibernate的好处,其中之一就是集合管理)