Nhibernate一对多删除不工作

时间:2011-04-18 17:42:11

标签: nhibernate fluent-nhibernate cascade inverse

您好我有一对一的ComplianceSet - > ComplianceItem。 ComplianceItem具有一对多ComplianceItem - > ComplianceItemInstance。

我有

ComplianceSet

HasMany(x => x.GetUserComplianceItems()).Inverse().Access.CamelCaseField(Prefix.Underscore).LazyLoad().Cascade.AllDeleteOrphan();

ComplianceItem

HasMany(x => x.GetUserComplianceItemInstances()).Inverse().Access.CamelCaseField(Prefix.Underscore).LazyLoad().Cascade.AllDeleteOrphan();

然后在我的代码中我有

userComplianceSet.GetUserComplianceItems().FirstOrDefault(....); ... userComplianceItem.RemoveUserComplianceItemInstance(userComplianceItemInstance);

此代码返回

已删除的对象将通过级联重新保存(从关联中删除已删除的对象)[DecisionCritical.Core.Domain.UserComplianceSet#12]

现在这非常令人沮丧。如果我从两个集合中删除级联,代码会返回成功,但db显示它没有做任何事情。 ComplianceItemInstance.ComplianceItemId字段仍然填充,当然该项仍然存在。 在任何情况下,我只是希望能够从一个集合中删除一个孩子,在持有该集合的对象上调用save并让那个怪物消失。我已经尝试了各种级联排列,保存(保存集,保存项目)向ComplianceItemInstance添加删除等等,并且无法使其工作。

请帮忙

1 个答案:

答案 0 :(得分:1)

我一直在努力做同样的事情。反应有点晚,但也许未来的读者可能会受益。

在子表上允许null作为外键的解决方案有效,但从数据库设计的角度来看,如果您的孩子无法在没有父级的情况下存在,则可能不合适。纯粹因为NHibernate需要它来修改数据库设计,这不是我喜欢的。从双向变为单向也是不可取的。所以我潜入并尝试了各种映射组合。

我发现使用inverse = true修复了问题。首先我认为这是来自NHibernate的不良行为,因为inverse = true主要解释为使子集合负责关系,我认为我已经通过手动更新子节点和父节点来解决这个问题。但是这个责任更像是数据库的东西。

使用inverse = true,仍然可以通过从父节点删除子节点来删除子节点,只要在映射的父节点上有Cascade.AllDeleteOrphan,一切都将正确更新。如果您选择使用Cascade.All,则还必须明确删除该子项。

如果未加载父级,您还可以选择立即删除子级,只需在当前会话中将其删除即可。但是,如果加载了父级,则这不起作用,在这种情况下,它将给出级联重新保存问题。

对我来说,底线是反向的。而且我还没有找到一个方案,其中inverse = false给了我更好的结果,但是一旦深入了解NHibernate,我可能会回到那个意见。