我很想感谢@Stefan Steinegger和@David昨天用多对多的映射帮助我。
我有3个表是“新闻”,“标签”和“News_Tags”,具有多对多关系,“News_Tags”是链接表。
如果我删除其中一条新闻记录,以下映射将删除所有具有相同标签的新闻记录。有一件事我需要注意,我只允许存储在“标记“表格。
这个映射对我有意义,它会删除标签和相关的新闻记录,但是如何用NHibernate实现标记系统呢?
有人能给我一些建议吗?非常感谢。
道明。
新闻映射:
<class name="New" table="News" lazy="false">
<id name="NewID">
<generator class="identity" />
</id>
<property name="Title" type="String"></property>
<property name="Description" type="String"></property>
<set name="TagsList" table="New_Tags" lazy="false" inverse="true" cascade="all">
<key column="NewID" />
<many-to-many class="Tag" column="TagID" />
</set>
</class>
标记映射:
<class name="Tag" table="Tags" lazy="false">
<id name="TagID">
<generator class="identity" />
</id>
<property name="TagName" type="String"></property>
<property name="DateCreated" type="DateTime"></property>
<!--inverse="true" has been defined in the "News mapping"-->
<set name="NewsList" table="New_Tags" lazy="false" cascade="all">
<key column="TagID" />
<many-to-many class="New" column="NewID" />
</set>
</class>
答案 0 :(得分:0)
当我遇到这样的麻烦时,我首先想到的是cascade选项。
答案 1 :(得分:0)
据我所知,映射是正确的(我正在使用看起来完全相同的映射文件)。问题是cascade
属性:“all”选项强制NHibernate将实体上的每个操作传播到集合的实例。在您的情况下,当您删除新闻项时,所有相关标签也会被删除。
您可能应该使用“none”(在这种情况下,您最终会在数据库中找到一些未使用的标签)或“delete-orphans”(在新闻项目方面 - 在标签端使用“none”)
答案 2 :(得分:0)
使用级联选项“save-update”。
选项“all”将级联删除,在这种情况下您不需要。但你选择“无”将要求Tag实体已经持久化,我想可能并非总是这样。
因此,通过将级联设置为“保存更新”新标签,直到插入到标签表和链接表News_Tags中,但是当您从新闻实体中删除标签时,它只会从链接表中删除而不是标签表。