2017-05-05 177 views
0

情況

我正在使用的這個項目使用NHibernate和Fluent NHibernate。
Oracle數據庫已經存在,不能/不應該改變。NHibernate忽略ForeignKey屬性

我遇到的問題是,流利的NHibernate似乎忽略了以下代碼示例中的ForeignKey屬性/方法。

Table("PERSON_PACKET"); 
Id(x => x.Id, "ID").GeneratedBy.UuidHex("N"); 

// Some Map(...) methods 

References(x => x.Packet) 
    .Column("PKT_IDENTIFICATION") 
    .ForeignKey("IDENTIFICATION") 
    .Cascade.None() 
    .Fetch.Select() 
    .Not.LazyLoad(); 

有人可以解釋這裏發生了什麼嗎?

怎樣discoved這個

數據庫的該部分的結構如下:

ERD

所有這三個實體實際上是視圖,而不是表,但它背後的表類似於。

PACKET視圖有兩個相似的字段。一個叫做IDENTIFICATION這是一個數字,一個叫ID,它是IDENTIFICATION與其他一些數據連接在一起,並且是一個varchar。
PACKET_PERSON具有具有相同的級聯格式PACKET.ID(所以不PACKET.IDENTIFICATION

奇怪的是上面的測繪工作,即使錯列是在ForeignKey方法列PKT_IDENTIFICATION。此映射自2014年以來一直有效。
然後我嘗試將ForeignKey方法更改爲ForeignKey("ID"),這也起作用。

最後我改變了方法到ForeignKey("JUST_SOMETHING_THAT_IS_NO_COLUMN")和事情繼續工作。

這裏發生了什麼?

回答

2

我認爲這種方法適用於模式生成。我認爲它相當於NH XML映射的一部分this

從文檔:

...指定的關聯生成的外鍵約束的名稱,使用它在<one-to-one><many-to-one><key><many-to-many>映射元素。

這就是爲什麼它沒有任何可觀察到的效果。如果您從映射文件生成數據庫,則只會看到名爲JUST_SOMETHING_THAT_IS_NO_COLUMN的外鍵約束。

如果你不打算生成模式,你的映射可能成爲:

References(x => x.Packet) 
    .Column("PKT_IDENTIFICATION") 
    .Cascade.None() 
    .Fetch.Select() 
    .Not.LazyLoad(); 

不會產生不良影響。

+0

感謝您的回答。在那種情況下,我想知道NHibernate如何知道引用哪個列,因爲這個數據庫沒有外鍵約束,並且該視圖沒有主鍵。 –

+0

NHibernate不檢查數據庫模式,不關心它。只有模型和繪圖問題。它從中推斷出它需要做什麼。 –

+0

它將使用'Packet'映射來計算其主鍵,然後使用您指定的'PKT_INDENTIFICATION'列來加入它們。 –