【发布时间】:2010-12-23 05:22:51
【问题描述】:
是否可以在打开的会话期间延迟加载相关对象,但在会话关闭后仍然可以使用相关对象?
例如,我们有一个 USER 类和一个相关的 ROLE 类。当我们加载一个 USER 时,我们也会延迟加载相关的 ROLE 对象。我们能否让 USER 和 ROLE 类在会话关闭后完全加载并可用?
这个功能可行吗?
【问题讨论】:
标签: c# nhibernate session lazy-loading
是否可以在打开的会话期间延迟加载相关对象,但在会话关闭后仍然可以使用相关对象?
例如,我们有一个 USER 类和一个相关的 ROLE 类。当我们加载一个 USER 时,我们也会延迟加载相关的 ROLE 对象。我们能否让 USER 和 ROLE 类在会话关闭后完全加载并可用?
这个功能可行吗?
【问题讨论】:
标签: c# nhibernate session lazy-loading
简短的回答:不。您必须在会话关闭后、关闭会话之前初始化您需要的任何内容。用于强制加载惰性代理(不枚举)的方法是NHibernateUtil.Initialize(USER.ROLES)。
长答案...有点。可以将对象“重新附加”到新会话,从而允许初始化 PersistentBags 和其他 NH 代理。最好的使用方法是Session.Lock(USER, LockMode.None),因为您知道该对象存在于数据库中但不存在于您的新会话中,并且您尚未修改它。这会将对象与新会话关联起来,而不会告诉 NHibernate 对对象的读取或写入执行任何操作。
但是,请注意这是代码异味。如果您经常将对象重新附加到新会话,这表明您没有保持会话打开足够长的时间。例如,每个窗口表单打开一个会话并在表单打开时保持打开状态没有问题,前提是您在窗口关闭时关闭它。
【讨论】:
如果您正在处理 1-1 关系(每个用户 0-1 个角色),那么可能最简单的选择是将其配置为急切获取而不是延迟加载。延迟加载确实适用于 1-* 亲属,或者特别大且很少需要的对象。 NH 在优化查询方面做得非常好,以便在这样的场景中快速包含急切的数据。
【讨论】:
是的。会话关闭后,任何延迟加载的对象都将保留在内存中,您可以毫无问题地访问它们。
【讨论】: