我試圖包裝遺留數據庫(不是由我創建)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期望組合鍵的兩個組件在另一個表中被引用 - 但它們不應該是,因爲一個是由鑑別器定義的。
例如,我有ADDRESS_RECORD表:
LINE_1 | CITY | STATE | ZIP
-----------------+-----------------+-----------+----------------
123 Any Street | Anytown | CA | 12345
的問題出現時,我嘗試了我的「國家」字段映射到我的狀態類。 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的知道自動提供「狀態」作爲組合鍵下半年的價值?
如果我可以提供更多信息,請讓我知道。