2011-01-25 2 views
0

NHibernate를 레거시 데이터베이스 주위에 랩핑하려고합니다. 그것은 내가 TABLE_DETAIL이라고 불리는 "테이블 테이블"로 가장 잘 묘사되어 있습니다.NHibernate 테이블 매핑 테이블

COLUMN_NAME | TABLE_VALUE | TABLE_DESC 
-------------+-----------------+--------------------------------- 
state  | CA    | California 
state  | NY    | New York 
... 
country  | US    | United States 
country  | CA    | Canada 

나는 테이블 당 클래스 계층 구조 전략이 사용 유창함 NHibernate에 매핑하기 위해 노력하고있어 : 그것은 다음과 같이 보입니다. 즉, 나는 TableDetail 클래스를 가지며 State와 Country를 하위 클래스로 가진다. 나는 COLUMN_NAME을 판별 자로 사용합니다.

TableDetailMap.cs :

public class TableDetailMap : ClassMap<TableDetail> 
{ 
    public TableDetailMap() 
    { 
    Table("TABLE_DETAIL"); 
    CompositeId() 
     .KeyProperty(x => x.TableValue, "TABLE_VALUE") 
     .KeyProperty(x => x.ColumnName, "COLUMN_NAME"); 
    Map(x => x.ColumnName).Column("COLUMN_NAME"); 
    Map(x => x.TableDesc).Column("TABLE_DESC"); 
    DiscriminateSubClassesOnColumn("COLUMN_NAME"); 
    } 
} 

StateMap.cs :

public class StateMap : SubclassMap<State> 
{ 
    public StateMap() 
    { 
    DiscriminatorValue("state"); 
    } 
} 

TABLE_DETAIL 따라서 (COLUMN_NAME/TABLE_VALUE 이루어진) 복합 키를 가지며, 상기 판별 한 것이다 그 분야의. 내 문제는 NHibernate가 합성 키의 두 구성 요소가 다른 테이블에서 참조 될 것으로 기대하지만, 구분자가 정의했기 때문에 복합 키의 두 구성 요소가 모두 필요하다고해서는 안됩니다.

LINE_1   | CITY   | STATE | ZIP 
-----------------+-----------------+-----------+---------------- 
123 Any Street | Anytown  | CA  | 12345 

문제는 내가 내 주 클래스에 내 "상태"필드를 매핑 할 때 온다 :

예를 들어, 나는 ADDRESS_RECORD 테이블을 가지고있다. ADDRESS_RECORD의 STATE 열은 TABLE_DETAIL 기본 키의 절반 (TABLE_VALUE 부분)을 참조합니다. COLUMN_NAME 부분은 "상태"입니다. 이는 판별 자이기 때문에 제공해야합니다. 그러나 NHibernate에 그렇게 생각하고,이 예외가 발생하지 않습니다

이 이
Foreign key (FK3D33E87CA66E339C:ADDRESS_RECORD [STATE])) must have same number of columns as the referenced primary key (TABLE_DETAIL [TABLE_VALUE, COLUMN_NAME]) 

가 어떻게 NHibernate에 자동으로 복합 키의 두 번째 절반의 값으로 "상태"를 제공하기 위해 알 수 있도록이를 매핑 할 수 있습니까?

자세한 정보를 제공 할 수 있으면 알려 주시기 바랍니다.

답변

0

나는 그렇게 수정했다. 을 사용하는 매핑의 모든 클래스에서,

public class TableDetailMap : ClassMap<TableDetail> 
{ 
    public TableDetailMap() 
    { 
    ...snip... 

    DiscriminateSubClassesOnColumn("COLUMN_NAME").AlwaysSelectWithValue(); 
    } 
} 

다음 : 기본 클래스 맵 (TableDetailMap.cs)에서 나는 판별을 지정한 경우, 나는, "항상 값 선택"지정과 같이 TableDetail 객체, 그래서 같이 가져올 때 "선택"을 사용하도록 지정할했다 : 이것은 아직도 내가 복합 ID의 일부로 사용 이러한 개체 중 하나를 한 경우에는 작동하지 않았다

public class AddressRecordMap : ClassMap<AddressRecord> 
{ 
    public AddressRecordMap() 
    { 
    ...snip... 

    References(x => x.State) 
     .Column("STATE") 
     .Fetch.Select(); 

    ...snip... 
    } 
} 

. 나는 그것을 고치는 방법을 모르지만, 지금은 그 문제를 해결할 수 있었다.