删除父项时如何使NHibernate删除子引用?

时间:2009-01-14 21:25:22

标签: nhibernate

我有一个如此映射的NewsFeed对象:

<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>

可以拥有一组他们可能会参与其中的所选Feed的用户,如下所示:

<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。

实现这一目标的最佳方法是什么?

更新:删除NewsFeed时,使用cascade =“all-delete-orphan”代替“all”仍会导致异常:

  

DELETE语句与REFERENCE约束“FKC8B9DF81601F04F4”冲突。冲突发生在数据库“System”,表“dbo.SystemUserSelectedNewsFeeds”,列'NewsFeedId'。

3 个答案:

答案 0 :(得分:2)

JMCD

你的第二种方法:

  

另一种选择是打破   与联接的多对多关系   n中间的中间阶层   能够确定   亲子关系和   级联应该工作。

实际上是nHibernate人员在他们的文档中推荐的。

  

不要使用异国情调的关联映射。

     

真正多对多的好用例   协会很少见。大部分的   你需要更多信息的时间   存储在“链接表”中。在这   例如,使用两个更好   与...的一对多关联   中间环节类。事实上,我们   认为大多数协会都是   你是一对多和多对一的   使用任何其他时应小心   协会风格,并问自己是否   这是非常必要的。

使用两个一对多关联可以灵活地轻松地将其他属性添加到“订阅”中,例如该特定订阅的通知首选项。

答案 1 :(得分:1)

由于集合中的关系是多对多的,nHibernate无法分辨关系的哪一端是孩子,哪个是父母,而我实现我想要的最快方式就是写一些我通过我的存储库发送的SQL,它从集合中删除了相应的新闻源,然后删除了父新闻源。下次收集水合物时,反映了这些变化。

另一个选择是打破中间连接类的多对多关系,nHiberate将能够确定父子关系,并且级联应该起作用。

答案 2 :(得分:0)

变化

cascade="all"

cascade="all-delete-orphan"

Reference