2009-03-02 60 views
2

我有以下對象模型:NHibernate的映射麻煩

  • 頂層抽象類Element多子女和後代。
  • A類Event
  • 每個Element包含一包Event s。
  • 每個Event都有一個父指針Element

到目前爲止 - 相當標準的一對多關係。

但是,我想使用每個具體類策略的表。所以,類Element未映射到數據庫。我試圖通過這種方式來解決它:Element的每個具體後代都定義了它自己的袋子Event s。這個問題是每個<bag>元素包含一個<key>元素。該關鍵指向EventParent財產。它還使Event的表中的Parent列成爲包含Bag的表的外鍵!但是一列不能成爲幾個表的外鍵,而我在插入時遇到了異常。

我也試着讓Event的表中的Parent字段成爲多對多的字段。這工作。但是,當我想要使關係雙向時,意思是,爲了給Element的後代添加行李,我會回到同樣的問題。 Bag =>外鍵=>插入時出現異常。

我敢肯定,這種情況並不像看起來那麼獨特。 非常感謝您的幫助。

回答

1

稍遲,但我有一些建議。

如果您使用「每個具體類的表」,就好像您要映射完全獨立的表。所以你需要單獨的外鍵或多對多的。

許多任何商店的類型名稱和NH知道外鍵指向的地方。但是這樣的外鍵是不可能的。

如果具有相同類型的項目幾袋,確保它們都定義了不同的外鍵:

<class name="A"> 
    <!-- ... --> 
    <bag name="Events"> 
    <key column="A_FK"/> 
    <one-to-many class="Event"/> 
    </bag> 
</class> 

<class name="B"> 
    <!-- ... --> 
    <bag name="Events"> 
    <key column="B_FK"/> 
    <one-to-many class="Event"/> 
    </bag> 
</class> 

你可以有這樣一個外鍵外鍵約束,但沒有非空約束,因爲只使用這些外鍵中的一個。

要確實只有一個帶有所有約束的外鍵,則需要將元素映射到單獨的表。