NHibernate延迟加载 - 会话结束后

Pie*_*ere 4 c# nhibernate session lazy-loading

是否可以在打开会话期间延迟加载相关对象,但在会话关闭后仍然可以使相关对象可用?

例如,我们有一个USER类和一个相关的ROLE类.当我们加载USER时,我们也懒惰加载相关的ROLE对象.会话关闭后,我们可以将USER和ROLE类完全加载并可用吗?

这个功能可以吗?

Kei*_*thS 8

简答:不.在关闭会话之前,您必须在会话结束后初始化您需要的任何内容.用于强制加载惰性代理(不枚举它)的方法是NHibernateUtil.Initialize(USER.ROLES).

答案很长......有点儿.可以将对象"重新附加"到新会话,从而允许初始化PersistentBags和其他NH代理.如果您知道对象存在于数据库中而不是新会话中,并且您尚未对其进行修改,那么最佳使用方法是Session.Lock(USER, LockMode.None).这会将对象与新会话相关联,而不会告诉NHibernate对对象的读取或写入执行任何操作.

但是,请注意,这是代码味道.如果您经常将对象重新连接到新会话,则表明您没有将会话保持足够长的时间.例如,每个窗口窗体打开一个会话没有问题,只要窗体打开就保持打开状态,提示您在窗口关闭时将其关闭.