首页 > 解决方案 > 使用子集合更新 NHibernate 对象

问题描述

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

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

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 层获得更改并尝试使用以下方法更新现有对象时:

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

这里的 newParent 是一个临时对象(在早期会话中从数据库中获得,并显示在 UI 中),它包含与我要更新的对象相同的标识符,但对子集合进行了更改。不知何故,使用这种方法我只能添加孩子,但不能修改或删除它们。

我的错误在哪里?

标签: c#nhibernatefluent-nhibernatenhibernate-mapping

解决方案


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

当您从 NHibernate 保存或获取实体时,您的 ChildrenISet会加载一个PersistentGenericSet(实现ISet) 的实例,该实例负责帮助跟踪您的集合的更改。

简而言之,不要分配给 Children 属性。实际上,制作 setter protected。只是Add()Remove()Clear()它根据需要。


推荐阅读