NHibernate多对多删除表中的所有数据

时间:2010-01-04 23:37:30

标签: nhibernate

我很想感谢@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>

3 个答案:

答案 0 :(得分:0)

当我遇到这样的麻烦时,我首先想到的是cascade选项。

答案 1 :(得分:0)

据我所知,映射是正确的(我正在使用看起来完全相同的映射文件)。问题是cascade属性:“all”选项强制NHibernate将实体上的每个操作传播到集合的实例。在您的情况下,当您删除新闻项时,所有相关标签也会被删除。

您可能应该使用“none”(在这种情况下,您最终会在数据库中找到一些未使用的标签)或“delete-orphans”(在新闻项目方面 - 在标签端使用“none”)

答案 2 :(得分:0)

使用级联选项“save-update”。

选项“all”将级联删除,在这种情况下您不需要。但你选择“无”将要求Tag实体已经持久化,我想可能并非总是这样。

因此,通过将级联设置为“保存更新”新标签,直到插入到标签表和链接表News_Tags中,但是当您从新闻实体中删除标签时,它只会从链接表中删除而不是标签表。