2009-04-21 83 views
2

我想通過映射將對象的集合到父對象中。獲取沒有主鍵的子項NHibernate

我有一個父對象「ScoreCard」,其主鍵是一個GUID(ID)和一個孩子「Score」對象,其主鍵是一個GUID(ID)。我想選擇基於兩個字段父的子對象,這兩個對象有,但我不能讓它工作,這裏的映射

<bag name="ScoreCard"> 
    <key> 
    <column name="HoleId"/> 
    <column name="PlayerId"/> 
    </key> 
    <one-to-many class="Score" not-found="ignore"/> 
</bag> 

我沒有設計的數據庫,但記分卡對象來從一個視圖返回列我需要加上邪惡的指導。無論我嘗試過什麼,NHibernate都會拋出關於與外鍵不一樣的外鍵的異常。

這對我來說似乎是最簡單的要求,得到了一些標準的東西的集合,爲什麼我這麼卡住?

感謝您的幫助,對於不好的示例代碼(在親戚家中潛意識看高爾夫球)感到抱歉。

回答

3

嗯,我最終發現它。父對象是從給出三列而沒有鍵的視圖中繪製的。我可以將複合鍵映射到HoleId和PlayerId,而不是我在查看代碼時找到的邪惡GUID。這很好,因爲我可以輕鬆映射我需要的Score對象,然後使用NHibernateUtil.Initialize延遲加載它們。

我的XML映射需要像這樣

<class name="ParentObject"> 
    <composite-id> 
     <key-property name="HoleId" column="HoleId" /> 
     <key-property name="PlayerId" column="PlayerId" />  
    </composite-id> 
    <property name="EvilGuid" column="Id" /> 
    <bag name="ScoreCard"> 
     <key> 
     <column name="HoleId"/> 
     <column name="PlayerId"/> 
     </key> 
     <one-to-many class="Score" not-found="ignore"/> 
    </bag> 
</class> 

我得到了我的靈感來自this post,還請注意Stefan的回答,因爲我覺得我在這裏度過了一個幸運符,以及設計可以變得更好更多關於DDD的想法。

感謝您的幫助。

1

問題是這樣的:NHibernate最好(但不僅僅是)爲DDD,這意味着首先創建域類,並使數據庫最適合域模型。

您有與非主鍵字段的複合ID關係。所以開始祈禱NHibernate可以應付這個問題。對於傳統數據庫,支持複合ID和非主鍵關係,並且通常不鼓勵DDD。

我認爲兩者的結合不起作用。在NHibernates問題追蹤器上查看此問題: https://nhibernate.jira.com/browse/NH-1722。您可以爲該功能投票。

+0

謝謝,我有一個複合鍵的複合外鍵的例子,但我可以看到它是我需要的屬性ref。 ORM規定數據庫的設計似乎很難,但我可以看到你關於DDD的觀點,所以我可能會考慮重新設計,而我仍然有機會。 – 2009-04-22 08:17:06

+0

NHibernate試圖儘可能少地指定領域模型,並做得很好(至少比其他選擇更好)。通過支持各種關係模型,它可能只佔90%左右。以任何列值鏈接行很少見,難以映射到類模型。關係模型更加靈活。 – 2009-04-22 08:42:19