>我正在尝试使用 .在休眠会话上找到的 Update(( 方法。我唯一能做的是添加子项,我不能修改或删除它们。
为澄清起见,对象及其映射如下:
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 中(,包含与我要更新的对象相同的标识符,但对子集合进行了更改。不知何故,使用这种方法,我只能添加孩子,但不能修改或删除它们。
我的错误在哪里?
最有可能发生在您身上的是,您不是修改 NHibernate 在您的父实体中实例化的集合,而是将其全部替换为HashSet
的新实例。
当您从 NHibernate 保存或获取实体时,您的子ISet
加载了一个PersistentGenericSet
实例(实现ISet
(,该实例负责帮助对集合进行此更改跟踪。
简而言之,不要分配给 Children 属性。事实上,让二传手protected
. 只需根据需要Add()
或Remove()
或Clear()
即可。