gpt4 book ai didi

nhibernate - 如何在 NHibernate 中删除子对象?

转载 作者:行者123 更新时间:2023-12-03 05:15:24 25 4
gpt4 key购买 nike

我有一个父对象,它与子对象的 IList 具有一对多关系。删除子对象的最佳方法是什么?我不会删除父级。我的父对象包含子对象的 IList。以下是一对多关系的映射:

<bag name="Tiers" cascade="all">
<key column="mismatch_id_no" />
<one-to-many class="TGR_BL.PromoTier,TGR_BL"/>
</bag>

如果我尝试使用clear()从集合中删除所有对象,然后调用SaveOrUpdate(),我会收到此异常:

System.Data.SqlClient.SqlException: Cannot insert the value NULL into column

如果我尝试单独删除子对象,然后将它们从父对象中删除,则会出现异常:

deleted object would be re-saved by cascade

这是我第一次在 NHibernate 中删除子对象。我做错了什么?

编辑:只是为了澄清 - 我不想删除父对象,只是删除子对象。我将父级的关系设置为一对多。我是否还需要在子对象映射上创建多对一关系?

最佳答案

您收到第一个错误是因为,当您从集合中删除项目时,NHibernate 的默认操作模式只是简单地中断关联。在数据库中,NHibernate 尝试将子行上的外键列设置为 null。由于您不允许该列中存在空值,因此 SQL Server 会引发错误。清除集合不一定会删除子对象,但一种方法是设置cascade=all-delete-orphan。这通知 NHibernate 它应该删除新的孤立行而不是设置外键列。

您收到第二个错误,因为当您调用 SaveOrUpdate 时,NHibernate 首先删除所有子对象。然后,因为这两个关系都没有标记为反向关系,NHibernate 还会尝试将子表中的外键列设置为 null。由于行已被删除,您会收到第二个错误。您需要在关系的一侧设置 inverse=true 来解决此问题。这通常在一侧(主键或父键)完成。如果您不这样做,NHibernate 将为关系的每一方进行适当的更新。不幸的是,运行两个更新并不是合适的做法。

您应该始终将关系的一侧标记为相反的一侧。根据您的编码方式,您可能需要也可能不需要使用级联。如果您想像尝试使用 Clear() 那样利用一次性删除,则需要定义级联。

关于nhibernate - 如何在 NHibernate 中删除子对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/302720/

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