2009-01-14 59 views
5

我有映射爲這樣的新聞源對象:當我刪除一個父項時,如何讓NHibernate刪除子項引用?

<class name="NewsFeed"> 
    <id name="NewsFeedId"> 
     <generator class="guid"/> 
    </id> 

    <property name="FeedName" not-null="true" /> 
    <property name="FeedURL" not-null="true" /> 
    <property name="FeedIsPublished" not-null="true" /> 
</class> 

和用戶誰可以有選擇的一組反饋,他們可能會在intereseted,映射像這樣:

<class name="SystemUser"> 
    <id name="SystemUserId"> 
     <generator class="guid"/> 
    </id> 


    <set name="SelectedNewsFeeds" table="SystemUserSelectedNewsFeeds" cascade="all"> 
     <key column="SystemUserId" /> 
     <many-to-many column="NewsFeedId" class="NewsFeeds.NewsFeed, Domain"/> 
    </set> 

</class> 

我想什麼發生的是當我刪除父NewsFeed時,所有SelectedNewsFeed引用也被刪除,而無需加載每個SystemUser並手動刪除NewsFeed。

達到此目的的最佳方法是什麼?

UPDATE:使用級聯=「全刪除,孤兒」,而不是「全部」刪除新聞源時,仍然會導致一個例外:

DELETE語句衝突與基準約束「FKC8B9DF81601F04F4」 。衝突發生在數據庫「System」,表「dbo.SystemUserSelectedNewsFeeds」,列'NewsFeedId'。

回答

2

JMCD

你的第二個辦法:

另一種方法是打破在中間聯接 類 許多一對多的關係,其nHiberate 將能夠確定 父兒童關係和 級聯應該工作。

實際上是nHibernate人員在他們的文檔中推薦的。

不要使用外來的關聯映射。

真正的多對多 協會很好的用例很少見。大部分的 時間你需要額外的信息 存儲在「鏈接表」。在這個 的情況下,使用兩個 一對多關聯到一個 中間鏈接類要好得多。事實上,我們 認爲大多數協會是 一對多和多對一,你使用任何其他 協會風格時應該小心,並問自己是否真的需要 。

使用兩個一對多關聯可以很靈活地輕鬆地將其他屬性添加到「訂閱」,例如特定訂閱的通知首選項。

0

變化

cascade="all" 

cascade="all-delete-orphan" 

Reference

+0

嗯..我正在使用NHibernate 2.2,發生這種情況:[MappingException:不支持的級聯樣式:刪除孤兒] – jmcd 2009-01-14 21:49:00

1

由於集合中的關係是多對許多人來說,NHibernate的是不能夠告訴的哪一端關係是孩子,哪一方是父母,最快捷的方式是實現自己想要的目標就是寫出自己的想法e通過我的存儲庫發送的刪除集合中相應新聞訂閱源的SQL,然後刪除父新聞訂閱源。下次收集水分時,變化反映出來。

另一種替代方法是打破與中間連接類的多對多關係,nHiberate將能夠確定父子關係並且級聯應該起作用。

相關問題