使用子集合更新 NHibernate 对象



>我正在尝试使用 .在休眠会话上找到的 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()即可。

相关内容

  • 没有找到相关文章

最新更新