使用 child 集合更新 NHibernate object

Update NHibernate object with child collection

我正在尝试使用在休眠会话中找到的 .Update() 方法用 child 集合更新 nHibernate object。对于当前设置,我唯一能做的就是添加 children,我无法修改或删除它们。

为澄清起见,objects 及其映射如下:

public class Parent {
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual ISet<Child> Children { get; set; } = new HashSet<Child>();
}

public class ParentMap: ClassMap<Parent>
{
   public ParentMap()
   {
     Id(x => x.Id);
     Map(x => x.Name);
     HasMany(x => x.Children)
       .AsSet()
       .Inverse()
       .Cascade.AllDeleteOrphan();
   }
}

public class Child {
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual Parent Parent { get; set; }
}

public class ChildMap: ClassMap<Child>
{
   public ChildMap()
   {
       Id(x => x.Id);
       Map(x => x.Name);
       References(x => x.Parent);        
   }
}

当我从我的 UI 层获得更改并尝试使用以下方法更新已经存在的 object 时:

using (var tx = _session.BeginTransaction())
     _session.Update(newParent);
     tx.Commit();
}

这里的 newParent 是一个瞬态 object(在较早的会话中从数据库中获取并在 UI 中显示)包含与我想更新的 object 相同的标识符,但对 child 集合进行了更改。不知何故,使用这种方法我只能添加 children,但不能修改或删除它们。

我的错误在哪里?

最有可能发生在您身上的是,您没有修改 NHibernate 在您的 Parent 实体中实例化的集合,而是将其全部替换为 HashSet 的新实例。

当您从 NHibernate 保存或获取实体时,您的 Children ISet 会加载 PersistentGenericSet(实现 ISet)的实例,该实例具有有责任帮助您的 collection.

进行此更改跟踪

总之,不要赋值给Children属性。事实上,使 setter protected。 只需 Add()Remove()Clear() 即可。