NHibernate完全填充部分加载的集合

本文关键字:加载 集合 填充部 NHibernate | 更新日期: 2023-09-27 18:19:57

我有一个包含Project对象的架构。每个项目都有一个所有者,还有一个SharePermission对象的附加集合,详细说明了也可以访问该项目的其他用户。SharePermissions指向类型为IdentityUser 的更详细的用户对象

在这种情况下,我使用以下方法加载ProjectsIEnumerable

 /// <summary>
 /// Gets a collection of projects that a user id has access to view.
 /// </summary>
 public static IEnumerable<Project> GetVisibleByUserFuture(ISession session, int userId)
 {
     Project p = null;
     ProjectShare s = null;
     IdentityUser u = null;
     return session.QueryOver<Project>(() => p)
         .Left.JoinAlias(() => p.SharePermissions
                , () => s                // Only join when we are not owner
                , Restrictions.On(() => p.OwnerId).Not.IsIn(new [] { userId }))
         .Left.JoinAlias(() => s.User, () => u)
         .Where(() => s.User.UserId == userId || p.OwnerId == userId)
         .Future();
 }

您会注意到SharePermissions部分对联接有限制,因此只加载该集合的一部分。

稍后,我想从以前加载的IEnumerable集合中选择一个Project,并无限制地加载完整的SharePermissions集合。

我不完全确定我该怎么做
我只是再次加载一个全新的Project对象吗
或者,我可以重用现有的Project对象,并以某种方式告诉NH完全填充SharePermissions集合吗?

NHibernate完全填充部分加载的集合

在这种情况下,解决方案将是session.Refresh(project)。如本文所述:

  • 9.2.加载对象(小引用)

使用Refresh()方法可以随时重新加载对象及其所有集合。当数据库触发器用于初始化对象的某些属性时,这很有用。

...
session.Refresh(project);

但我建议更改查询。只选择一个根实体项目,使用子查询对其进行筛选,应用批量提取来加载集合

检查这些链接以获取批处理和子查询示例:

  • 批处理获取概述
  • 子查询示例
  • NHibernate-使用Junction/Joiner表的多对多查询