2012-02-08 2 views
2

Fluent NHibernate를 사용하여 완전한 객체 (모든 연관된 객체가 있음)를로드하는 방법은 무엇입니까? 이 경우 개체의 이름이 Project이고 범주 및 그림 목록이 연결되어 있습니다.Fluent NHibernate로 전체 객체로드하기

 public ProjectMap() 
    { 
     Id(x => x.Id); 

     Map(x => x.Title).Not.Nullable(); 
     Map(x => x.Year); 
     Map(x => x.Slug).Not.Nullable(); 
     Map(x => x.Description).CustomSqlType("nvarchar(MAX)").Not.Nullable(); 
     References(x => x.Category, "CategoryId").Not.Nullable(); 
     HasMany(x => x.Gallery) 
      .Inverse() 
      .Cascade.All(); 
    } 

그리고 저장소 방법 전체 개체를 반환해야한다 : : 매핑 파일은 다음과 같다

public Project Read(int id) 
    { 
     using (var session = NHibernateHelper.OpenSession()) 
     { 
      var project = session.CreateQuery("FROM Project WHERE Id = :Id LEFT JOIN FETCH p.Category LEFT JOIN FETCH p.Gallery") 
       .SetParameter("Id", id).UniqueResult<Project>(); 
      return project; 
     } 
    } 

답변

3

난 당신이 기본적으로 게으른로드 할 있으리라 믿고있어,하지만 때로는 열망로드 필요할 때 원하는 . 열성적인로드 (권장하지 않음)를 항상 원하면 Not.Lazyload 대신 매핑에서 수행하고 .Fetch()를 사용하여 가져 오기 전략을 선택해야합니다.

그렇지 않으면 NHibernate의 쿼리 메서드 중 하나를 사용하여 원하는 것을 수행해야합니다. HQL 쿼리 나 Linq 쿼리, 그리고 아마도 Criteria 쿼리를 사용하여이 작업을 수행 할 수 있습니다.

여기에 LINQ 쿼리는 다음

session.Linq<Project>() 
    .Fetch(p => p.Category) 
    .FetchMany(p => p.Gallery).FirstOrDefault(); 

개의 HQL 버전 여기

session.CreateQuery("SELECT p FROM Project p FETCH JOIN p.Category FETCH JOIN p.Gallery") 
    .UniqueResult<Project>(); 

입니다 (이것은, 3.2에서 그 전에 사용할 수 있는지 확실하지 않습니다 작동)를 기준 버전

session.CreateCriteria<Project>("p") 
    .SetFetchMode("p.Category", FetchMode.Join) 
    .SetFetchMode("p.Gallery", FetchMode.Join) 
    .UniqueResult<Project>(); 
+0

것입니다 나는 ".CreateQuery ("프로젝트에서 어디에서 ID = : Id 왼쪽 조인 FETCH.Category LEFT JOIN FETCHG.PLC ")를 사용했습니다. .SetParameter ("Id", id) .UniqueResult (); " 하지만 작동하지 않습니다 .. 난 여전히 "초기화 [Model.Entities.Category # 1] - 프록시 초기화 할 수 없습니다 - 세션 없음"오류가 발생합니다. " – Ante

+0

하지만 INNER JOIN .. 도와 주셔서 감사합니다. – Ante

관련 문제