我有一个包含Project
个对象的架构。每个项目都有一个所有者,以及一个SharePermission
个对象的附加集合,详细说明了也可以访问项目的其他用户。 SharePermissions指向类型为IdentityUser
在这种情况下,我使用以下方法加载IEnumerable
Projects
:
/// <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集合吗?
答案 0 :(得分:1)
在这种情况下,解决方案是 session.Refresh(project)
。如此处所述:
可以使用Refresh()方法随时重新加载对象及其所有集合。当数据库触发器用于初始化对象的某些属性时,这很有用。
...
session.Refresh(project);
但我建议更改查询。只选择一个根实体Project,使用子查询对其进行过滤,对集合加载应用批量获取
检查这些链接以获取批量提取和子查询示例: