C# 从集合中删除在Nhibernate中不起作用

C# 从集合中删除在Nhibernate中不起作用,c#,nhibernate,C#,Nhibernate,我知道有很多关于这方面的线索,但我已经尝试了所有我能看到的东西有一段时间了,但仍然没有运气 我有一个Item对象,它包含itemdocument的集合。使用nhibernate链接到数据库,我可以轻松地添加到我的itemdocument集合中,更新其中的项目,等等,但是无论我做什么,我都不能删除 我从尝试从中删除项目的同一会话中加载该项目。我甚至将会话添加为item对象的属性,并使用该属性保存它,以防万一 如果我对集合中的itemdocument使用Session.Delete(),然后重新保存

我知道有很多关于这方面的线索,但我已经尝试了所有我能看到的东西有一段时间了,但仍然没有运气

我有一个Item对象,它包含itemdocument的集合。使用nhibernate链接到数据库,我可以轻松地添加到我的itemdocument集合中,更新其中的项目,等等,但是无论我做什么,我都不能删除

我从尝试从中删除项目的同一会话中加载该项目。我甚至将会话添加为item对象的属性,并使用该属性保存它,以防万一

如果我对集合中的itemdocument使用Session.Delete(),然后重新保存item对象(不从集合中删除itemdocument),它实际上会创建一个新对象,这是预期的。这说明我的储蓄有效

我希望这一切都有意义,我有点沮丧,可能没有我想要的那么清楚

请参见item对象的my映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="namespace.Business.BusinessEntity">

  <class name="Item, namespace" table="[dbo].[Item]">

    <id name="ItemId" column="ItemId" type="Int32" unsaved-value="0">
      <generator class="identity" />
    </id>       

    <property name="ItemCode" column="ItemCode" type="String" length="50" />
    <property name="InternalDescription" column="InternalDescription" type="String" length="254" />
    <property name="IsEnabled" column="IsEnabled" type="Boolean" />
    <property name="Size" column="Size" type="String" length="50" />      

    <set name="Pictures" cascade="all-delete-orphan" inverse="true" >
      <key column="ItemId" not-null="true"/>
      <one-to-many class="ItemDocument" />
    </set>

  </class>
</hibernate-mapping>

您是否尝试删除收集项目,然后重新获取该项目?与获取要删除的项目的引用一样,删除它,然后使用hql重新获取更新的对象?

可能只是部分代码,但没有调用
会话.Flush()
。在调用Flush之前,不会将任何内容保留到数据库中(对于默认的Flush模式Auto)。试试这个:

item.Pictures.Remove(item.Pictures.ElementAt(0));
session.Flush();
如果项是临时对象,则只需调用
SaveOrUpdate
。假设您已经使用NHibernate检索到该项,则该项是持久的。在文档中有详细信息

编辑:图片是反向的,因此您必须在集合的“多”侧将引用设置为null:

var pictureToRemove = item.Pictures.ElementAt(0);
pictureToRemove.Item = null;
item.Pictures.Remove(pictureToRemove);
session.Flush();

我不确定我是否在关注你,你有没有一个例子?如果我这样做:item.Pictures.ElementAt(0).Order=9;session.Flush();它对数据库运行更新(如果执行SaveOrUpdate(),则相同)。如果我像你上面说的那样做,什么也不会发生。这对我所有的收藏都是一样的,有些东西我在这里没有得到…在SQL Server方面仍然没有做任何事情。如果我尝试执行Session.Delete(pictureToRemove);它触发一个错误,表示not null属性已设置为null。这是否包装在任何类型的事务中?我不确定这是否重要,但ItemDocumentId的未保存值是否应为0?ItemDocumentId不是0,因为它确实存在。你是说如果我想删除它,我应该将其设为0?对于事务,使用与否没有区别。对ItemDocument进行更新确实会持续到DB,因此我假设事务不是我的问题。
item.Pictures.Remove(item.Pictures.ElementAt(0));
session.Flush();
var pictureToRemove = item.Pictures.ElementAt(0);
pictureToRemove.Item = null;
item.Pictures.Remove(pictureToRemove);
session.Flush();