2

我有 3 个表,它们是具有多对多关系的“新闻”、“标签”、“News_Tags”。

通过以下映射,“News”和“Tags”表已更新,但“News_Tags”尚未更新。

谁能帮我?

消息:

<class name="News" table="News" lazy="false">
  <id name="NewsID">
    <generator class="identity" />
  </id>
  <property name="Title"/>
  <set 
    name="TagsList" 
    table="News_Tags" 
    inverse="true" 
    lazy="false" 
    cascade="save-update">

      <key column="NewsID" not-null="true" />
      <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"/>
  <property name="DateCreated"/>

  <set 
    name="NewsList"
    table="News_Tags"
    inverse="true"
    lazy="false"
    cascade="save-update">

      <key column="TagID" not-null="true" />
      <many-to-many class="News" column="NewsID" />
  </set>

</class>

新闻_标签

<class name="NewsTags" table="News_Tags" lazy="false">
  <id name="NewsTagID">
    <generator class="identity" />
  </id>    
  <property name="TagID"/>
  <property name="NewsID"/>
</class>

非常感谢

道明。

4

2 回答 2

2

这个映射中有一些奇怪的东西。

  • 两个集合TagsListNewsList都是逆的。所以 NHibernate 不存储它们。反向表示:“此信息已在另一个集合中,因此在存储时忽略此信息”。仅在双向关系的一侧放置逆。
  • NewsTags被映射为一个类,即使它不是一个类。它只是数据库中的一个表,用于映射(双向)多对多关系。只需删除此类映射。
  • 级联由两个集合设置。我不确定如果News实例引用它们是否要创建新标签,但您很可能永远不想创建新News实例,因为它们被某些标签引用。我会在那里删除它。
于 2010-01-03T23:38:27.293 回答
1

我同意@Stefan,您的映射不正确。如果我正确理解新闻和标签之间存在多对多关系,则 News_Tags 是您的连接/连接表,在这种情况下,您不必提供映射文件。

您的新闻和标签的映射文件应该关注联结/连接表,而无需映射它。考虑一下我在用户和角色之间的多对多映射,希望这将提供一些指导。

用户映射

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">

<class name="BM.BEAST.Core.Common.User, BM.BEAST.Core" table="[User]" lazy="false">
  <id name="ObjId" column="ObjId" type="Guid">
    <generator class="guid"/>
  </id>
  <property name="UserName" column="UserName" type="String" not-null="true"/>
  <property name="FirstName" column="FirstName" type="String" not-null="true"/>
  <property name="LastName" column="LastName" type="String" not-null="true"/>
  <property name="Initials" column="Initials" type="String" not-null="true"/>
  <property name="LastLoginDtm" column="LastLoginDtm" type="Timestamp"/>
  <property name="Disabled" column="Disabled" type="Boolean"/>
  <property name="OnLine" column="OnLine" type="Boolean"/>    
  <bag name="Roles" table="UserRole" lazy="true">
    <key column="UserObjId"/>
    <many-to-many class="BM.BEAST.Core.Common.Role, BM.BEAST.Core" column="RoleObjId"/>
  </bag>
  <bag name="Sessions" table="Session" lazy="true" cascade="all-delete-orphan">
    <key column="ActiveUser"/>
    <one-to-many class="BM.BEAST.Core.Common.Session, BM.BEAST.Core" not-   found="ignore"/>
  </bag>
</class>

角色映射

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">

  <class name="BM.BEAST.Core.Common.Role, BM.BEAST.Core" table="[Role]" lazy="false">
    <id name="ObjId" column="ObjId" type="Guid">
      <generator class="guid"/>
    </id>
    <property name="Code" column="Code" type="String" not-null="true"/>
    <property name="Name" column="Name" type="String" not-null="true"/>
    <property name="Sequence" column="Sequence" type="Int16" not-null="true"/>
  </class>

</hibernate-mapping>
于 2010-01-03T23:46:16.503 回答