我有一个如下映射的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'中.
联合MCD
你的第二种方法:
另一种选择是用中间的连接类来打破多对多关系,nHiberate 将能够确定父子关系并且级联应该可以工作。
实际上是 nHibernate 人员在他们的文档中推荐的。
不要使用奇异的关联映射。
真正的多对多关联的良好用例很少见。大多数时候您需要在“链接表”中存储附加信息。在这种情况下,最好使用两个一对多关联到一个中间链接类。事实上,我们认为大多数关联都是一对多和多对一的,在使用任何其他关联样式时应该小心,并问问自己是否真的有必要。
使用两个一对多关联增加了轻松向“订阅”添加其他属性的灵活性,例如该特定订阅的通知首选项。
| 归档时间: |
|
| 查看次数: |
6134 次 |
| 最近记录: |