2010-01-04 61 views
0

我很感谢@Stefan Steinegger和@David昨天以多对多的映射为我提供帮助。NHibernate多对多删除表中的所有数据

我有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

当我遇到这样的麻烦,我玩弄的第一件事是cascade选项。

+0

嗨,肯,谢谢。我已经尝试了这篇文章中所有可能的选项。我想也许我的解决方案是不正确的。 – 2010-01-04 23:47:22

0

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

您可能应该使用“无”(在这种情况下,您最终会得到一些未使用的标记在数据库中)或“删除孤儿”(在消息项目一侧 - 在标记一侧使用“无” )。

+0

嗨,我已经尝试了你的建议,并得到以下错误:“对象引用未保存的瞬态实例 - 在冲洗之前保存瞬态实例。”有什么想法吗? – 2010-01-05 00:18:21

+0

是的,忘了那个。由于NHibernate不会级联更新集合,因此标记实例将不会更新。如果你添加一个新的标签到集合中,那个实例将不会被持久化,并且NHibernate将尝试创建到它的链接失败。在这种情况下,解决方案是在持久保存新闻项时手动保存每个标记实例的SaveOrUpdate()。 有点笨拙,但这是一种折衷:其他级联设置会自动保留实体,但可能会导致其他问题。 – LorenzCK 2010-01-05 13:21:29

0

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

选项“全部”将级联删除,在这种情况下您不需要这些删除。但是,您选择“无”将需要标记实体已被持续,我想可能并非总是如此。

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

+0

嗨Torkel,我试过你的解决方案,设置新闻映射和标签映射级联=“保存更新”。它有两个问题:1.当我做新闻更新时,包括标签更新。它做了更新,但并没有从链接表中删除旧标签; 2.当我尝试删除新闻时,它给了我错误:“删除的对象将通过级联重新保存(从关联中删除已删除的对象)”。我对此很困惑。任何其他想法? – 2010-01-05 11:49:55