2010-07-03 55 views
2

我知道这方面有很多线索,但我一直在尝试我可以看到的一段时间,但仍然没有运气。从收藏中删除不在Nhibernate中工作

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

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

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

我希望这一切是有道理的,我变得有点沮丧,可能不明确的,因为我想...

见我映射项目目标:

<?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); 
+0

是这个包裹的任何类型的交易的内部? – apollodude217 2010-07-05 02:48:06

+0

我不确定这是否重要,但ItemDocumentId的未保存值是否应为0? – apollodude217 2010-07-05 02:49:39

+0

ItemDocumentId不是0,因为它确实存在。你是说我应该让它变成0,如果我想删除它? 对于交易,如果我使用一个没有差异。对ItemDocument进行更新会持续到数据库,所以我假设事务不是我的问题。 – David 2010-07-05 02:53:31

回答

0

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

+0

我不确定我是否关注你,你有没有一个例子? – David 2010-07-04 00:59:54

3

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

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

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

编辑:照片是反方,所以你必须设置在收集的“多”方引用空:

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

如果我这样做: item.Pictures.ElementAt(0).Order = 9; session.Flush(); 它针对数据库运行更新(如果我执行SaveOrUpdate(),则同样)。 如果我像上面一样做,没有任何反应。对我所有的收藏都是一样的,有些东西我没有在这里... – David 2010-07-04 18:53:36

+0

仍然没有在SQL Server端做任何事情。 如果我尝试做 Session.Delete(pictureToRemove); IT会触发一个错误,指出非空属性已设置为空。 – David 2010-07-04 22:15:03