2010-01-03 37 views
2

我有一個3表,這是「新聞」,「標籤」,「News_Tags」與多對多的關係。NHibernate多對多表不更新

通過以下映射,「新聞」和「標籤」表已更新,但「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

對不起,我無法突破某些行,否則將不會顯示。 – 2010-01-03 23:15:00

+0

在每行的開頭需要4個空格才能將其格式化爲代碼。除非它被解釋爲HTML,否則將被刪除或隱藏。 – 2010-01-03 23:46:46

回答

2

這個映射有一些奇怪的事情。

  • 這兩個集合TagsListNewsList是相反的。所以NHibernate不存儲它們。反意味着:「這個信息已經在另一個集合中,所以在存儲時忽略這個」。僅在雙向關係的一側進行反演。
  • NewsTags被映射爲一個類,即使它不是一個類。它只是數據庫中的一個表格,用於映射(雙向)多對多關係。只要刪除這個類映射。
  • 級聯由兩個集合設置。我不確定您是否想要創建新標記(如果它們被News實例引用),但您很可能從不想創建新的News實例,因爲它們被某個標記引用。我會在那裏刪除它。
+0

非常感謝。你節省了我的時間。好孩子。 – 2010-01-04 21:09:00

1

我同意@Stefan,你的映射是不正確的。如果我正確理解News和Tags之間存在多對多關係,那麼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>