2010-12-03 59 views
3

尝试将NHibernate迁移到现有的C#WinForms应用程序中,并且我正在寻找管理会话的最佳方法。我只是在学习NHibernate,所以请原谅我的知识缺乏,有人可以给我提供我们可以使用的任何会话管理代码,我们发现的大部分实现都是针对网络应用的。NHibernate - Session Singleton C#

任何帮助表示赞赏。

回答

1

桌面应用的最好的文章假设你已经熟悉XML和NHibernate的配置本身,还有就是你需要做一个单身,也就是ISessionFactory API一个对象。为什么这应该成为一个singleton的原因是,关于连接的完整配置以及所有的实体映射都被加载到内存中,以便NHibernate知道如何以及在哪里坚持到底层数据存储中。因此,ISessionFactory API实例化成本非常高。

至于会话,有两个方面需要考虑,无论你想要一个无状态还是一个有状态的会话。这个选择完全是你的,但知道它的区别。

ISession API会跟踪附加实体上的每个变更。附加实体是使用NHibernate提供的一种可能方式从底层数据存储区加载的实体,或者是刚刚实例化并且已将自己附加到会话的临时实体。为toolong保留这样一个有状态的会话可能会导致数据丢失,这将在该API泄漏到内存中时发生。一旦发生泄漏,整个变更轨道都会被丢弃,并且会话不能再使用。 ISession API应始终与ITransaction API一起使用。 ITransaction可能与直接在SQL中使用Begin Transaction相同(TSQL,PL/SQL和其他)。每次您需要坚持进入数据库时​​,您都应该在使用交易时这样做,以防止错误排除变更或无论如何。 ISession API应该在工作单元的开始处实例化。一次只能使用一个ISession API实例来处理多个表单。也就是说,将ISession API实例设置为单例是一个非常糟糕的主意,因为内存管理原因,ISession会跟踪发生在附属实体上的所有更改。保持ISession API活动时间过长会导致它使用越来越多的内存,这会导致内存泄漏和会话垃圾。

IStatelessSession API做它所说的。它是无状态的,它不会跟踪对附加对象所做的任何更改。因此,您将不得不手动知道要针对您打算坚持的实体的数据库执行哪些操作,比方说。 IStatelessSession也使用ITransaction API来处理数据完整性。在连接到数据存储区时,这两者应始终相互配合使用。 IStatelessSession通常在创建时根据需要使用,因为它除了与数据存储“交谈”以外没有其他用处。我相信,这个API主要用于无状态规则最多的Web应用程序。

一旦您选择了最符合ISessionIStatelessSesion API之间的要求,即可开始使用。