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

답변

1

이 경우의 솔루션은 session.Refresh(project)입니다. 여기에 설명 된 바와 같이 :

  • 9.2. Loading an object는 (소가 인용)은 새로 고침() 메소드를 사용하여 언제든지 목적 및 모든 컬렉션을 다시로드 할 수있다. 데이터베이스 트리거를 사용하여 개체의 일부 속성을 초기화 할 때 유용합니다.

... 
session.Refresh(project); 

하지만 쿼리를 변경하는 것이 좋습니다 것입니다.