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); 

但我會建議更改查詢。只選擇一個根實體項目,使用子查詢過濾它,應用批量抓取,收集裝載

檢查這些鏈接,批量抓取和子查詢的例子: