Nhibernate 在子集合更新时未检测到父项的更改

Posted

技术标签:

【中文标题】Nhibernate 在子集合更新时未检测到父项的更改【英文标题】:Nhibernate Not detecting changes to parent when child collection updates 【发布时间】:2016-06-22 07:59:57 【问题描述】:

如何在 nhibernate 中进行设置,以便在调用 session.Save() 时,它会检测到其集合的更改。

想要在子集合更改(插入、更新或删除)时更新父记录。

谢谢

【问题讨论】:

为什么需要更新父节点?是关于乐观锁定吗?如果实体已附加,则无需调用更新。你有分离的实体吗? 父记录是主记录。例如如果你更新一门学科的成绩,整个学生记录的更新日期也应该更新。我的问题是,只有当它的属性发生变化时,nhibernate 才会自动保存,但我也想检查它的集合是否有更新 【参考方案1】:

您可以通过在集合定义上设置级联属性来设置 Nhibernate 以在保存父集合时保存子集合更改,这样您的集合映射将如下所示:

<bag name="Children" table="tblChildren" inverse ="true" cascade="all-delete orphan" lazy="true">
  <key column="ChildId"/>
  <one-to-many class="XXXX.Child, XXX"/>
</bag>

【讨论】:

【参考方案2】:

父更改日期需要由您的业务逻辑处理。如果您明确设置它,NH 将保存它。如果在 NHibernate 事件或拦截器中设置了更改日期,那么您将迷失方向,因为 NH 没有理由更新父级。

您实际上应该有一种处理父更改的服务。至少在不让该服务知道的情况下,不会直接更改儿童。此服务明确设置父级的更改日期。这是业务逻辑的一部分。

【讨论】:

是的,我只是期待检测实体是否有变化的层也可以检测实体子集合是否有变化。向该层插入额外的逻辑就足够了,但我不确定这是否暴露在 NH 的某个地方

以上是关于Nhibernate 在子集合更新时未检测到父项的更改的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate:如何获取没有子集合的对象?

尝试使用填充将两个子集合关联到父集合

将 boundingRect() 映射到父项并相交会产生意外的碰撞处理结果

使用 nHibernate 选择具有许多子集合的实体的性能不佳

NHibernate在脚下射击:协会所有权和版本控制

NHibernate有一个懒惰的负载