2010-07-16 3 views
2

여러개의 세부 라인이있는 헤더의 간단한 객체 모델을 가지고 있습니다. 머리글 개체의 bag 속성을 줄 클래스에 매핑하고 줄 속성에 양방향 관계를 설정하는 header 속성을 추가했습니다.NHibernate 일대 다 매핑이 ​​백을 채우지 않습니다.

NHibernate 프로필러를 사용하여 테스트를 실행할 때 쿼리가 수행되고 헤더와 줄이 데이터베이스에서 가져 오지만 컬렉션은 항상 비어 있음을 알 수 있습니다.

줄 개체 모음을 직접 쿼리 할 때 머리글 개체가 올바르게 채워지는 것을 볼 수 있으므로 매핑이 제대로 된 것 같습니다.

약간 비표준적인 측면은 라인 객체가 복합 키를 가지고 있다는 것입니다. (이것은 레거시 DB이며 변경할 수 없습니다.) 이것이 문제인지 궁금합니다. 여기

은 (간체) 내 클래스와 매핑

<class name="Header" table="HEADER"> 
    <id name="ID" column="HEAD_ID"> 
     <generator class="assigned" /> 
    </id> 

    <bag name="Lines" table="BODY" order-by="BODY_LINE"> 
     <key column="BODY_HEADER_ID"/> 
     <one-to-many class="Line"/> 
    </bag> 
    </class> 

    <class name="Line" table="BODY"> 
    <composite-id> 
     <key-property name="ID" column="BODY_HEADER_ID"/> 
     <key-property name="Line" column="SBODY_LINE"/> 
    </composite-id> 
    <many-to-one class="Header" name="Head" column="BODY_HEADER_ID" /> 
    </class> 

    public class Header { 
     public virtual string ID { get; set; } 
     public virtual IList<Line> Lines { get; set; } 
    } 

    public class Line { 
     public virtual string ID { get; set; } 
     public virtual int Line { get; set; } 
     public virtual Header Head { get; set; } 

     public override bool Equals(object obj) { 
      var other = obj as Line; 

      return ID == other.ID && Line == other.Line; 
     } 

     public override int GetHashCode() { 
      return (ID + "|" + Line.ToString()).GetHashCode(); 
     } 
    } 

나는 라인이 별도로 객체에 대한 조회하여이 문제를 얻을 수 있습니다,하지만 난 내가 잘못 알고 싶습니다.

EDIT : 좋아, 내가 물건을 단순화했을 때, 나는 그것을 매우 일관되게하지 않았다. 혼란을 드려 죄송합니다. 더 정확히 반영하기 위해 매핑과 클래스 정의를 변경했습니다.

답변

3

동일한 열을 두 번 (BODY_HEADER_ID) 매핑하고 HEADER 테이블에 대해 서로 다른 세 가지 클래스 이름을 사용합니다.

<class name="Line" table="BODY"> 
    <composite-id> 
    <key-many-to-one class="Header" name="Header" column="BODY_HEADER_ID"/> 
    <key-property name="Line" column="SBODY_LINE"/> 
    </composite-id> 
</class> 

그리고 물론

는, 라인 헤더에 해당 하나의 기준이 있어야합니다

이 올바른 라인 매핑입니다.

+0

관계의 한 쪽 또는 다른 쪽에서도 "Inverse = true"를 사용하십시오. – apollodude217

+0

아폴로가 맞습니다. 가방은 반전되어야하고 아마도 계단식 = "모두"이어야합니다. –

+0

@Diego 헤더와 Payslip (매핑이 표시되지 않음)이라는 두 가지 클래스 이름 만 HEADER 테이블에 표시됩니다. 세 번째는 어디 있습니까? – apollodude217

관련 문제