我有一个如此映射的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'。
答案 0 :(得分:2)
JMCD
你的第二种方法:
另一种选择是打破 与联接的多对多关系 n中间的中间阶层 能够确定 亲子关系和 级联应该工作。
实际上是nHibernate人员在他们的文档中推荐的。
不要使用异国情调的关联映射。
真正多对多的好用例 协会很少见。大部分的 你需要更多信息的时间 存储在“链接表”中。在这 例如,使用两个更好 与...的一对多关联 中间环节类。事实上,我们 认为大多数协会都是 你是一对多和多对一的 使用任何其他时应小心 协会风格,并问自己是否 这是非常必要的。
使用两个一对多关联可以灵活地轻松地将其他属性添加到“订阅”中,例如该特定订阅的通知首选项。
答案 1 :(得分:1)
由于集合中的关系是多对多的,nHibernate无法分辨关系的哪一端是孩子,哪个是父母,而我实现我想要的最快方式就是写一些我通过我的存储库发送的SQL,它从集合中删除了相应的新闻源,然后删除了父新闻源。下次收集水合物时,反映了这些变化。
另一个选择是打破中间连接类的多对多关系,nHiberate将能够确定父子关系,并且级联应该起作用。
答案 2 :(得分:0)