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

jmc*_*mcd 5 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>
Run Code Online (Sandbox Code Playgroud)

并且可以拥有一组他们可能会参与其中的所选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>
Run Code Online (Sandbox Code Playgroud)

我想要发生的是当我删除父NewsFeed时,所有SelectedNewsFeed引用也被删除,而不必加载每个SystemUser并手动删除NewsFeed.

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

更新:使用cascade ="all-delete-orphan"而不是"all"仍然会在删除NewsFeed时导致异常:

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

Tre*_*ent 2

联合MCD

你的第二种方法:

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

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

不要使用奇异的关联映射。

真正的多对多关联的良好用例很少见。大多数时候您需要在“链接表”中存储附加信息。在这种情况下,最好使用两个一对多关联到一个中间链接类。事实上,我们认为大多数关联都是一对多和多对一的,在使用任何其他关联样式时应该小心,并问问自己是否真的有必要。

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