从集合中删除不适用于Nhibernate

时间:2010-07-03 16:22:54

标签: c# nhibernate

我知道周围有许多线索,但我一直在尝试我现在​​能看到的一切,但仍然没有运气。

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

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

如果我在集合中的itemdocument上使用Session.Delete(),然后我重新保存item对象(不从集合中删除itemdocument),它实际上创建了一个新对象,这是预期的。所以这告诉我我的保存工作正常。

我希望这一切都有道理,我有点沮丧,可能不会像我想的那样清楚......

查看我的映射是否有项目对象:

<?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>

Itemdocument对象的映射:

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

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

    <id name="ItemDocumentId" column="ItemDocumentId" type="Int32">
      <generator class="identity" />
    </id>       

    <property name="Order" column="[Order]" type="Int32"  />

    <many-to-one name="Item" class="Item" column="ItemId" not-null="true" />
    <many-to-one name="Document" class="Document" column="DocumentId"  cascade="save-update" not-null="true"/>

  </class>
</hibernate-mapping>

删除代码:

//This does nothing
item.Pictures.Remove(item.Pictures.ElementAt(0));
session.SaveOrUpdate(item);

//This neither
session.Delete(item.Pictures.ElementAt(0));
item.Pictures.Remove(item.Pictures.ElementAt(0));
session.SaveOrUpdate(item);

2 个答案:

答案 0 :(得分:4)

也许这只是部分代码,但没有调用session.Flush()。在调用Flush之前,没有任何内容持久保存到数据库中(对于Auto的默认FlushMode)。试试这个:

item.Pictures.Remove(item.Pictures.ElementAt(0));
session.Flush();

如果item是瞬态对象,您只需要调用SaveOrUpdate。假设您已经使用NHibernate检索了项目,那么它是持久的。文档中的Chapter 9有详细信息。

编辑:图片是反面的,所以你必须在集合的“多”面上将引用设置为null:

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

答案 1 :(得分:0)

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