0

我有一个我开发的 Web 应用程序,它有一个相当复杂的保存例程。用户构建和修改一系列计划,然后选择保存数据。此时所有的添加、删除和修改都被一次性保存(都在一个事务中)。

Plan
    Collection Of Child
        Collection of ChildDetail

大部分保存是通过在计划对象上调用 SaveOrUpdate 并让此保存管理计划及其子项来执行的。当我想插入一条新记录时,我使用零作为未保存的值,并使用 cascade=all-delete-orphan 来确保如果在客户端删除了子对象或子详细信息对象,则该对象将被删除。

但是,当发生以下情况时,我收到一个异常:用户创建一个包含子对象的计划并保存它们。这会很好地保存。

Plan(id=0)
    Child[0](id=0), Child[1](id=0), Child[2](id=0)

如果用户随后移除子对象,并在其位置添加新的子对象,然后尝试保存更改。

Plan(id=123)
    Child[0](id=0), Child[1](id=0), Child[2](id=0)

这会引发 GenericAdoException 无法插入具有内部异常“SQL0803 Duplicate Key Value Specified”的 Child。

我正在寻找的行为是 NHibernate 删除以前的子对象,然后在计划上调用 SaveOrUpdate 时插入新的子对象。我怎样才能在让父母管理关系的同时实现这一目标?

4

1 回答 1

0

我暂时找到的一个解决方案是将已删除子项的 ID 传递给保存例程。然后,我将新孩子的 ID 设置为已移除孩子的 ID。有效地将删除/添加转换为更新。

于 2012-06-17T13:57:14.980 回答