2010-12-22 103 views
4

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

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

此功能可能吗?

回答

8

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

长答案...种。可以将对象重新附加到新会话,从而允许初始化PersistentBags和其他NH代理。假设您知道对象存在于数据库中但不在新会话中,并且您尚未修改它的最佳方法是Session.Lock(USER, LockMode.None)。这会将对象与新会话关联起来,而不会告知NHibernate在读取或写入对象时做任何事情。

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

0

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

0

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