私はレガシーデータベース(私によって作成されていない)の周りに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])
は、どのように私はこれをマッピングすることができますか?
さらに詳しい情報を提供できる場合は、私にお知らせください。