我知道周围有许多线索,但我一直在尝试我现在能看到的一切,但仍然没有运气。
我有一个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);
答案 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重新获取更新的对象?