여러개의 세부 라인이있는 헤더의 간단한 객체 모델을 가지고 있습니다. 머리글 개체의 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 : 좋아, 내가 물건을 단순화했을 때, 나는 그것을 매우 일관되게하지 않았다. 혼란을 드려 죄송합니다. 더 정확히 반영하기 위해 매핑과 클래스 정의를 변경했습니다.
관계의 한 쪽 또는 다른 쪽에서도 "Inverse = true"를 사용하십시오. – apollodude217
아폴로가 맞습니다. 가방은 반전되어야하고 아마도 계단식 = "모두"이어야합니다. –
@Diego 헤더와 Payslip (매핑이 표시되지 않음)이라는 두 가지 클래스 이름 만 HEADER 테이블에 표시됩니다. 세 번째는 어디 있습니까? – apollodude217