1

我有一个与Project对象的架构。每个项目都有一个拥有者,以及一个额外的SharePermission对象集合,详细说明也可以访问该项目的其他用户。NHibernate完全填充部分加载的集合

/// <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部分对的加盟,使限制:SharePermissions指向型IdentityUser

在这种情况下更详细的用户对象,我用的方法装载的ProjectsIEnumerable只有该集合的一部分被加载。

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

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

+0

可能想尝试'NhibernateUtil.Initialize(p.SharePermissions)'但我认为它只适用于代理对象,而不是部分加载的集合。 – dotjoe 2014-08-29 18:22:25

回答

1

在这种情况下的解决方案将是session.Refresh(project)。正如这里记录:

,能够在任何时间,重新装载对象和它的所有集合使用Refresh()方法。当数据库触发器用于初始化对象的某些属性时,这很有用。

... 
session.Refresh(project); 

但我会建议更改查询。只选择一个根实体项目,使用子查询过滤它,应用批量抓取,收集装载

检查这些链接,批量抓取和子查询的例子: