【问题标题】:Nhibernate one to many delete not working休眠一对多删除不起作用
【发布时间】:2011-04-18 17:42:10
【问题描述】:

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

我有

合规集

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

合规项目

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

然后在我的代码中我有

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

这段代码返回

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

现在这非常令人沮丧。如果我从两个集合中删除级联,则代码返回成功,但数据库显示它没有做任何事情。 ComplianceItemInstance.ComplianceItemId 字段仍然被填充,当然该项目仍然存在。 无论如何,我只想能够从集合中删除一个孩子,对持有该集合的对象调用 save 并让这该死的东西消失。我已经尝试了级联的各种排列方式,保存(保存集合,保存项目)将删除添加到 ComplianceItemInstance 等等,但无法让它工作。

请帮忙

【问题讨论】:

  • RemoveUserComplianceItemInstance 的代码是什么?
  • 好的,所以我弄清楚了问题所在,我认为 Ilya 即将向我指出这个方向。因为这是一个双向关系,所以我必须在保存父级之前设置 UserComplianceItemInstance.UserComplianceItem = null。
  • 现在我尝试了各种方法,其中之一是使它成为单向引用,但是(当时我不知道)如果 fk 设置为不为空db 表单向引用不起作用,因为它使用 null fk 保存子项,然后使用 fk 更新子项。我收到“无法在 fk 中插入 null”错误,并假设我走错了路。不管怎样,现在一切都好起来了。虽然少了几天的生活。我可以标记加一以找出我自己的答案吗? :)
  • 是的,您可以回答自己的问题并选择您的答案作为接受的答案,甚至鼓励这样做。见这里:meta.stackexchange.com/questions/17845/… 和这里:meta.stackexchange.com/questions/12513/… 和这里:meta.stackexchange.com/questions/17463/…

标签: nhibernate fluent-nhibernate cascade inverse


【解决方案1】:

我一直在为同样的事情苦苦挣扎。反应有点晚,但也许未来的读者可以受益。

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

我发现使用 inverse = true 可以解决问题。首先,我认为这是 NHibernate 的不良行为,因为 inverse = true 主要被解释为使子集合负责关系,我认为我已经通过手动更新子集合和父集合来涵盖了这一点。但这个责任更多是数据库的事情。

使用 inverse = true,仍然可以通过从父级中删除子级来删除它,只要您在映射的父级上有 Cascade.AllDeleteOrphan,所有内容都会正确更新。如果您选择使用 Cascade.All,您还必须显式删除子级。

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

我的底线是,逆向作品。而且我还没有找到 inverse = false 给我带来更好结果的场景,但是一旦深入研究 NHibernate,我可能会回到那个观点。

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 2012-09-04
    • 2015-10-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多