Nhibernate一对多删除不起作用

Nhibernate一对多删除不起作用,nhibernate,fluent-nhibernate,cascade,inverse,Nhibernate,Fluent Nhibernate,Cascade,Inverse,嗨,我有一个一对多合规集->合规项。ComplianceItem具有一对多ComplianceItem->ComplianceItemInstance 我有 顺应集 HasMany(x=>x.GetUserComplianceItems()).Inverse().Access.CamelCaseField(前缀.下划线).LazyLoad().Cascade.AllDeleteOrphan(); 及 顺应性 HasMany(x=>x.GetUserComplianceItemInstances

嗨,我有一个一对多合规集->合规项。ComplianceItem具有一对多ComplianceItem->ComplianceItemInstance

我有

顺应集

HasMany(x=>x.GetUserComplianceItems()).Inverse().Access.CamelCaseField(前缀.下划线).LazyLoad().Cascade.AllDeleteOrphan();

顺应性

HasMany(x=>x.GetUserComplianceItemInstances()).Inverse().Access.CamelCaseField(前缀.下划线).LazyLoad().Cascade.AllDeleteOrphan();

那么在我的代码中

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

此代码返回

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

现在这是非常令人沮丧的。如果我从两个集合中移除级联,代码将返回成功,但db显示它没有做任何事情。ComplianceItemInstance.ComplianceItemId字段仍然填充,当然该项仍然存在。 在任何情况下,我只想能够从集合中删除一个子集,调用保存该集合的对象的save,然后让这个奇怪的东西消失。我尝试了各种排列方式,如级联、保存(保存集合、保存项目)、将删除添加到ComplianceItemInstance等等,但都无法实现


请帮助我

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

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

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

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

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


对我来说,底线是,反向工作。我还没有发现一种情况,在这种情况下,inverse=false会给我带来更好的结果,但一旦深入研究NHibernate,我可能会回到这个观点。

RemoveUserComplianceItemInstance的代码是什么?好吧,我知道问题出在哪里了,我想Ilya会告诉我这个方向。因为这是一个双向关系SIP,所以在保存父级之前,我必须设置UserComplianceItemInstance.UserComplianceItem=null。现在我尝试了各种方法,其中之一就是将其作为单向引用,(当时我不知道这一点)如果在db表中将fk设置为not null,则单向引用将不起作用,因为它使用null fk保存子项,然后使用fk更新子项。我得到了“不能在fk中插入null”错误,并假设我走错了方向。不管怎样,现在一切都好了。虽然少了几天的生命。我可以加一分来找出我自己的答案吗?:)是的,你可以回答你自己的问题,并选择你的答案作为被接受的答案,这甚至是鼓励的。请看这里:和这里:和这里: