2011-08-18 6 views
1

나는 판별 자 역할을하는 나의 POCO 중 하나에 Status 속성을 가지고 있습니다 (enum과 매우 유사합니다).구분 기호가 프록시로 반환되는 이유는 무엇입니까?

여기에 Status 열이있는 HBM의 일부입니다.

<many-to-one class="Locate.Common.Domain.Statuses.Status, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Status"> 
    <column name="Status_id" not-null="true" /> 
</many-to-one> 

그리고 여기에는 Status 테이블 내 HBM입니다.

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="Locate.Common.Domain.Statuses.Status, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Status`"> 
    <id access="nosetter.lowercase-underscore" name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Status_id" /> 
     <generator class="assigned" /> 
    </id> 
    <discriminator type="String"> 
     <column name="Status_id" /> 
    </discriminator> 
    <property access="nosetter.lowercase-underscore" name="Name" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Name" not-null="true" /> 
    </property> 
    <property access="nosetter.camelcase-underscore" name="IsUserSelectable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="IsUserSelectable" not-null="true" /> 
    </property> 
    <subclass name="Locate.Common.Domain.Statuses.CallbackStatus, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="3" /> 
    <subclass name="Locate.Common.Domain.Statuses.EmergencyStatus, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="5" /> 
    <subclass name="Locate.Common.Domain.Statuses.FirstCheckerStatus, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="1" /> 
    <subclass name="Locate.Common.Domain.Statuses.PleaseAdviseStatus, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="4" /> 
    <subclass name="Locate.Common.Domain.Statuses.SecondCheckerStatus, Locate.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="2" /> 
    </class> 
</hibernate-mapping> 

마지막으로 여기에 내 QueryOver입니다.

var locates = 
    session.QueryOver(() => locateAlias) 
    .SelectList(x => x 
     .Select(xx => xx.WorkToBeginDateTime).WithAlias(() => sentTo.DueDate) 
     .Select(xx => xx.SendTo).WithAlias(() => sentTo.SentTo) 
     .Select(xx => xx.TicketNo).WithAlias(() => sentTo.TicketNo) 
     .Select(xx => xx.Status).WithAlias(() => sentTo.Status) 
    ) 
    .JoinAlias(() => locateAlias.Status,() => statusAlias) 
    .Where(() => locateAlias.IsComplete == false) 
    .TransformUsing(Transformers.AliasToBean<SentToDto>()).List<SentToDto>(); 

이 쿼리는 그러나 Status 속성이 제대로 초기화하기되지 않는 오류없이 실행됩니다. Status 값을 사용하려면이 예외가 발생합니다.

Initializing[Locate.Common.Domain.Statuses.Status#2]-Could not initialize proxy - no Session. 

내가이 사실 적절한 Status_id을 선택하는 것을 볼 수 NHibernate에 프로파일 러를 찾고 있습니다.

저에게 HBM 또는 쿼리의 문제점은 무엇입니까?

모든 상태를 쿼리하고 모든 상태 식별자 개체의 목록을받을 수 있음을 유의하십시오. NHibernate가 올바른 값을 적절하게 리턴 할 수 있도록 생성 된 프록시 객체가 Status 객체의 올바른 값을 포함하고 있음을 볼 수 있습니다.

답변

3

쿼리가 수행하지 않음 상태 속성을 Eeger로 가져오고 나중에 상태에 액세스 할 때 위치를로드 한 세션이 이미 닫혔습니다. 따라서 대신 .JoinAlias(() => locateAlias.Status,() => statusAlias)을 사용하십시오. .Fetch(locate => locate.Status).Eager

편집 : 해당 상태가 열심히 인출되지 않기 때문에 확인했습니다. locate 객체가 반환되는 경우에만 eager를 가져옵니다. 당신은 할 수있다 :

var locates = 
    session.QueryOver(() => locateAlias) 
    .Where(() => locateAlias.IsComplete == false) 
    .Fetch(locate => locate.Status).Eager 
    .ToEnumerable() 
    .Select(locate => new SentToDto 
    { 
     DueDate = locate.WorkToBeginDateTime, 
     SendTo = locate.SendTo, 
     TicketNo = locate.TicketNo, 
     Status = locate.Status, 
    }.ToList(); 
+0

나는 그것을 시도했다. 그러나 'Fetch'는 다 대일 관계에서 작동하지 않는다. – gcso

+0

@gcso huh? 왜 안돼? 나는 샘플 애플 리케이션에서 시도하고 Fetch는 many-to-one에서 잘 작동한다. – Firo

+0

'Fetch' 문서는'연관 페치 전략 지정. 현재 일대 다 및 일대일 연결 만 지원됩니다 .' 내가 뭘 놓치고 있는지 궁금해. – gcso

관련 문제