我有一个我开发的 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 时插入新的子对象。我怎样才能在让父母管理关系的同时实现这一目标?