请帮我解决以下情况。我有三张桌牌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