如何使用NHibernate创建标记系统(多对多)

时间:2010-01-05 16:43:01

标签: c# nhibernate orm nhibernate-mapping

我正在学习NHibernate,并希望你们能帮助我一点关于Tag Cloud设计和解决方案。

我有3个表是“新闻”,“标签”和“News_Tags”,具有多对多关系,“News_Tags”是链接表。

选项:

  1. cascade =“all”,cascade =“all-delete-orphan”如果删除其中一条新闻记录,它将删除所有具有相同标签的新闻记录

  2. cascade =“save-update”它适用于保存和更新,但如果我尝试删除新闻,则会给出错误:已删除的对象将通过级联重新保存(从关联中删除已删除的对象)

  3. 这是我的映射:

    标签:

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

    新闻:

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

    有人能为此提供一些解决方案吗? @Lck提到我可以手动执行此操作,任何人都可以为我提供一些代码示例吗?非常感谢你。

2 个答案:

答案 0 :(得分:0)

使用cascade="all",删除一个News对象应该只删除New_Tags表中的所有相应行,不是吗?我认为它不会删除所有标记的新闻项目。这不是你想要的行为吗?

答案 1 :(得分:0)

看看我刚才给出的答案:

What is the correct way to define many-to-many relationships in NHibernate to allow deletes but avoiding duplicate records

它没有直接回答你的问题,而是通过它的极端解决方案,它给你的评论可能会理解需要做些什么才能达到你所需要的。