2011-01-25 22 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から構成される)複合キーを有し、識別器が1でありますそれらのフィールドの。私の問題は、NHibernateはコンポジットキーの両方のコンポーネントが別のテーブルで参照されることを期待していますが、識別器によって定義されているため、そうである必要はありません。例えば

、私はADDRESS_RECORDテーブルを持っている:

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

私は国家クラスに私の「状態」フィールドをマップしようとすると問題がでてきます。 ADDRESS_RECORDのSTATE列は、TABLE_DETAIL主キーの半分(TABLE_VALUE部分)を参照します。 COLUMN_NAMEの部分は「状態」です。これは弁別者であるため、提供する必要があります。しかし、NHibernateのはそう思うと、この例外をスローしません:NHibernateのは、自動的に複合キーの後半の値として「状態」を提供することを知っているように

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

は、どのように私はこれをマッピングすることができますか?

さらに詳しい情報を提供できる場合は、私にお知らせください。

答えて

0

私はそうそう修正した。 を使用するマッピングクラスのすべてで、その後

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

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

:私は弁別を指定したベースクラスマップ(TableDetailMap.cs)、で、私はそうのように、「常に値を選択し、」指定されましたTableDetailオブジェクト、私はそうのように、フェッチする場合、「選択」を使用して指定する必要がありました:これはまだ私は、複合IDの一部として使用されるこれらのオブジェクトの1つを持っていた場合には動作しませんでした

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

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

    ...snip... 
    } 
} 

。それを修正する方法がわかりませんが、今のところ回避することができました。

関連する問題