2009-05-20 2 views
1

Iam은 NHibernate와 그 lazyload에 어려움을 겪고있다.NHibernate - LazyLoad one-to-zero

구조가 간단하지만 문제가 있습니다.

Class Shift { 
int ShiftID; 
DateTime ShiftStart; 
Employee Employee; 
} 

Class Employee { 
int EmployeeID; 
string Name; 
} 

데이터 :

시프트에 대한 나의로드 전략은 내가 NHibernate에 자동으로 왼쪽 않는 변화를로드 할 때 고객을 얻기 위해 가입 있도록 가입 사용
ShiftData 
ID       SHIFTTIME  EmployeeID (int) 
1       12:00     0 
2       13:00     1 
3       14:00     0       
4       13:00     3 


Employees 
ID       NAME 
1       Morten 
2       Peter 
3       Henrik 

. 이것은 종업원과의 교대를 위해 완벽하게 작동하지만 일부 종업원에게는 아직 종업원이 없습니다.

근무 교대가로드되면 Employee에 액세스하려고하면 데이터베이스에 대해 다른 SELECT가 발생합니다 (NHProfiler를 사용하여 알게 됨) 왜 이런 일이 발생합니까?

당신은 대답을 가지고 있기를 바랍니다.

+0

EmployeeID가 0 대신 null이어야합니까? – Canton

답변

1

제 생각 엔 직원이없는 근무자가 비어있는 Employee 프록시를 가지고 있기 때문입니다. Hibernate는 빈 프록시를보고 데이터베이스에서 데이터를로드하려고 시도한다.

해결 방법은 매핑이 실제로 도움이 될 것입니다. 그러나 관계에 fetch = "join"속성 세트가 있는지 확인하거나이 관계에 대한 지연로드를 해제 할 수 있습니다.

+0

글쎄, 사실 꽤 많이 시도했다. 클래스와 참조에서 모두 지연로드를 사용하여 조인을 수행합니다. 공개 ShiftMap() { Not.LazyLoad(); WithTable ("shift_db"); Id (x => x.id, "shift_id"). WithUnsavedValue (0); 지도 (x => x.Starttime, "shift_start"); 참고 자료 (x => x.Employee, "shift_employee") Join(). NotFound.Ignore(). Not.LazyLoad(); } –