我有3个表格,分别是“新闻”,“标签”,“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>
News_Tags
<class name="NewsTags" table="News_Tags" lazy="false">
<id name="NewsTagID">
<generator class="identity" />
</id>
<property name="TagID"/>
<property name="NewsID"/>
</class>
非常感谢
道明。
答案 0 :(得分:2)
此映射中有一些奇怪的东西。
TagsList
和NewsList
都是相反的。所以NHibernate不存储它们。反向意味着:“此信息已存在于另一个集合中,因此在存储时请忽略此信息”。只反向双向关系的一侧。NewsTags
被映射为一个类,即使它不是一个类。它只是数据库中的一个表,用于映射(双向)多对多关系。只需删除此类映射。News
实例引用了新标记,我不确定是否要创建新标记,但您很可能永远不想创建新的News
实例,因为它们被某些标记引用。我会把它删除。答案 1 :(得分: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>