2011-02-23 6 views
1

유창한 최대 절전 모드 맵에서 다소 이상한 요구 사항이 있습니다. 다른 테이블 (B)와 복합 외래 키 관계가있는 테이블 (A)이 있습니다. 테이블 A에 대한 매핑에서 테이블 B에서 생성 된 개체와 키를 정의하는 A의 개별 특성에 대한 액세스를 모두 갖고 싶습니다. 그것을 할 방법이 있습니까? 컬럼을 두 번 매핑하면 범위 예외를 벗어난 인덱스를 얻는 것처럼 보입니다.여러 번 열을 매핑하십시오.

테이블 B의 행이 없기 때문에 속성에 대해 B를 탐색 할 수는 없습니다. 나는 내가 다루고있는 구조에 몇 가지 중대한 냄새가 있음을 고통스럽게 알고있다. 그러한 것은 레거시 시스템을 다루는 사람들의 운명입니다.

답변

1

조금 해킹하여 일종의도 가능합니다.

우리는 우리가 발견하는 경우, 하나의 관련 요소를 검색하는 데 사용할 가짜 컬렉션있는 도메인을 정의하는거야 :

public class Foo 
{ 
    public virtual BarKey BarKey { get; set; } 
    public virtual Bar Bar { get { return Bars.SingleOrDefault(); } } 
    protected virtual ICollection<Bar> Bars { get; set; } 
} 

public class Bar 
{ 
    public virtual BarKey Id { get; set; } 
} 

//this class must override Equals and GetHashcode. Implementation not shown. 
public class BarKey 
{ 
    public virtual int X { get; set; } 
    public virtual int Y { get; set; } 
} 

BarKey 구성 요소의 일부 속성이 모두 포함 키. 이제

, 매핑 : NH가 알려줍니다

<class name="Foo"> 
    <id ...><generator .../></id> 
    <component name="BarKey"> 
    <property name="X" /> 
    <property name="Y" /> 
    </component> 
    <bag name="Bars" inverse="true"> 
    <key property-ref="BarKey"> 
     <column name="X"/> 
     <column name="Y"/> 
    </key> 
    <one-to-many class="Bar"/> 
    </bag> 
</class> 
<class name="Bar"> 
    <composite-id name="Id"> 
    <key-property name="X" /> 
    <key-property name="Y" /> 
    </composite-id> 
</class> 

property-ref 속성은 푸 대신 해당 ID의 BarKey 특성에 바에서 그 열을 일치.