請幫我解決以下情況。我有三張桌牌Cardlist,Contact和多對多表ContactCardlist。我想刪除Cardlist中刪除記錄的多對多表ContactCardlist中的所有記錄。因此,我找到了所需的Cardlist,使用foreach來迭代「contactcardlists」 - 設置並使用session.Delete(ItemFromTheSet)刪除每條記錄。但在transaction.commit()之後,我得到一個異常,說我們不能用NULL更新列CardlistId(在表ContactCardlist中)。因此使用「更新」命令,而不是「刪除」命令。使用Nhibernate刪除父項後,刪除多對多表中的所有記錄
下面您可以找到Cardlist和ContactCardlist表的映射。
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="XXXXX.Entities" assembly="XXXXX">
<class name="ContactCardlist" table="ContactCardlist">
<composite-id class="ContactsCardlistId" name="ContactsCardlistId" unsaved-value="any" >
<key-many-to-one name="cardlist" class="Cardlist" column="CardlistId" />
<key-many-to-one name="contact" class="Contact" column="ContactId" />
</composite-id>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="XXXXXXXXX.Entities" assembly="XXXXXXXXXXXXXX">
<class name="Cardlist" table="Cardlist">
<id name="cardlistid" column="cardlistid" type="int">
<generator class="native"/>
</id>
....//lots of properties
<set name = "contactcardlists" cascade="none" order-by="ContactId">
<key column ="cardlistid"/>
<one-to-many class="ContactCardlist" />
</set>
</class>
</hibernate-mapping>
謝謝大家提前。
對不起額外的問題:按照我的理解,我們可以只添加inverse =「true」表示集合的描述,並在foreach語句中使用Delete方法(沒有將屬性「cascade」從「None」更改爲「all-delete-orphan」)?你說「下一步改進」,據我所知,這不是一個強制性的改變。 – Max
inverse =「true」*(你肯定應該谷歌它,以獲得更多的信息,請)*表示:NHibernate,這個集合是由元素構建的,他們能夠關心自己。如果一切都正確設置,這意味着,一旦這個項目從集合中刪除,NHibernate直接與此項目溝通:到DELETE。沒有反向... NHibernate不能確定,並且必須首先執行UPDATE ...以從子刪除引用,然後刪除... –
非常感謝,我會將它谷歌它。 – Max