2011-01-25 156 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期望組合鍵的兩個組件在另一個表中被引用 - 但它們不應該是,因爲一個是由鑑別器定義的。

例如,我有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的知道自動提供「狀態」作爲組合鍵下半年的價值?

如果我可以提供更多信息,請讓我知道。

回答

0

我想出了一個如此修復。在基類圖(TableDetailMap.cs),其中I指定的鑑別器,我指定「總是與值選擇」,像這樣:

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

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

然後,在所有使用一個的映射類的TableDetail對象,我不得不指定使用「選擇」進行讀取時,就像這樣:

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

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

    ...snip... 
    } 
} 

這還是在我作爲一個複合ID的一部分,這些對象之一的情況下,沒有工作。我不知道如何解決這個問題,但我現在能夠解決它。