2011-04-15 55 views
3

我正在與一些非常奇怪的人放在一起的遺留數據庫工作。我正在編寫NHibernate DAL,但遇到一些奇怪的映射場景。NHibernate - 如何配置不使用主鍵的關聯

在一個例子中,我有一個包含多個字段的表,包括LE_RECNUM(整數主鍵)和LE_CODE(字符串)。

但是,由於某些深不可測的原因,整個數據庫中的所有關係都加入到LE_CODE而不是LE_RECNUM

我需要指定LE_RECNUM是我的映射文件中的Id,因爲我需要在插入記錄時生成主鍵。但是,我希望所有關聯使用LE_CODE而不是LE_RECNUM

任何人都可以建議我可能會這樣做嗎?

回答

6
References(x => x.SomeProperty).Column("LE_CODE").PropertyRef(x => x.SomePropertyInParent); 
+0

謝謝你。我一直在閱讀文檔,並且我並不真正瞭解這個property-ref映射最初的用途。我應該注意到什麼後果? – David 2011-04-18 10:00:11

+0

是的,請看這裏:http://216.121.112.228/browse/NH-2534 – cremor 2011-04-18 10:03:03

+0

再次感謝。我很驚訝Linq提供者沒有在同一個查詢中檢索父項和子項。但由於協會只是一種方式(從小孩到家長),我不會冒N + 1的風險。 – David 2011-04-18 12:22:09

0

您可以在關係(.KeyColumn)中指定想要的任何列。這方面的一個例子是:

public OrderHeaderMap() 
{ 
    Table("ORDER_HEADER"); 
    Id(x => x.Id, "ORDER_ID"); 

    HasMany(x => x.OrderLines) 
     .KeyColumn("ORDER_ID") 
} 

public OrderLineMap() 
{ 
    Table("ORDER_LINE"); 
    Id(x => x.Id, "ORDER_LINE_ID"); 

    References(x => x.Order, "ORDER_ID"); 
} 
+0

感謝。我有點困惑,但是因爲你已經演示了一個基於父表的主鍵(在這種情況下爲ORDER_ID)的關聯,這正是我試圖避免的!另外,我不想要雙向關聯,所以我只使用引用映射,而不使用HasMany映射。 – David 2011-04-18 08:52:47

+0

回想起來,我想知道你是否誤解了我的問題。我不希望能夠在子表中指定外鍵的名稱,我希望能夠指定要在父表中加入的字段的名稱(假設它實際上不是主鍵)。 – David 2011-04-18 09:05:38

+0

我誤解了你的問題。 – 2011-04-18 11:49:25