NHibernate延迟加载 - 会话结束后

时间:2010-12-22 02:29:38

标签: c# nhibernate session lazy-loading

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

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

这项功能可以吗?

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:0)

如果您正在处理1-1关系(每个用户0-1个角色),那么最简单的选择可能是将其配置为急切获取而不是延迟加载。延迟加载实际上是针对1- *亲属,或者特别大且很少需要的对象。 NH在优化查询方面做得非常好,可以在类似的场景中快速包含热切的数据。

答案 2 :(得分:0)

是。会话关闭后,任何延迟加载的对象都将保留在内存中,您可以毫无问题地访问它们。