gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:20:38 25 4
gpt4 key购买 nike

我知道有很多关于这个的话题,但我已经尝试了一段时间我能看到的一切,但仍然没有运气。

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

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

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

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

查看我对项目对象的映射:

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

最佳答案

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

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

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

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

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

关于c# - 从集合中删除在 Nhibernate 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3172068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com