nHibernate 保存一对多

Posted

技术标签:

【中文标题】nHibernate 保存一对多【英文标题】:nHibernate Save One-To-Many 【发布时间】:2010-01-20 22:19:28 【问题描述】:

我有一个包含子列表的父类。在 cascade.all 开启的情况下,我将父级和子级映射为双向,并在父级上设置了一个 has-many 和一个逆向。如果我修改了子列表中的对象,但没有在父级上的属性,nHibernate 不会保存子级。如果我修改父级的属性,一切都会保存得很好。这是设计使然还是我需要设置特殊属性?

【问题讨论】:

您是在父映射中映射了子,还是在子映射中映射了父,或者两者都有? 两者如下: (Parent) HasMany(x => x.Initiatives).KeyColumns.Add("ProjectId").AsBag().Cascade.SaveUpdate().LazyLoad() 。逆(); (子) 参考(x => x.ParentProject).Column("ProjectId").Cascade.SaveUpdate(); 我相信你必须在 Parent 上调用 save 才能让它拯救孩子。 谢谢,但我打电话给父母保存。问题是,如果 a 不修改父级上的简单属性,则不会触发子级的保存。如果我修改父级的简单属性,则子级更改保存正常。 【参考方案1】:

这可能与您将子项添加到集合的方式有关。在双向中,您必须在代码中管理关系的双方。考虑来自Fluent Nhibernate Getting Started Guide 的示例。检查商店实体。

一家商店有很多员工。 Store 的 Staff 属性是员工的集合。该关系设置为双向。

Store有如下方法

public virtual void AddEmployee(Employee employee)

  employee.Store = this;
  Staff.Add(employee);

如您所见,childs Parent 属性需要设置为父对象。如果不这样做,那么 Nhibernate 将无法了解孩子的父母是谁,并且如果仅修改孩子并调用 SaveOrUpdate(parent),则无法自动保存孩子。

两者都需要。

【讨论】:

【参考方案2】:

我想通了。我正在使用各种侦听器测试审计。当我附加到 IflushEntityListner 时,它导致保存停止工作。真是令人沮丧。谢谢大家!

【讨论】:

以上是关于nHibernate 保存一对多的主要内容,如果未能解决你的问题,请参考以下文章

一对多引用上的流畅 NHibernate 重复行

NHibernate 级联删除不适用于一对多关联

Nhibernate:如何用一对多关系表示多对多关系?

NHibernate 预选?

NHibernate左连接选择计数在一对多关系中

使用 NHibernate 进行级联更新一对多