C# 使用子集合更新NHibernate对象
我正在尝试使用hibernate会话中的.update()方法更新具有子集合的nHibernate对象。对于当前的设置,我唯一能做的就是添加子项,我不能修改或删除它们 为便于澄清,对象及其映射如下:C# 使用子集合更新NHibernate对象,c#,nhibernate,fluent-nhibernate,nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我正在尝试使用hibernate会话中的.update()方法更新具有子集合的nHibernate对象。对于当前的设置,我唯一能做的就是添加子项,我不能修改或删除它们 为便于澄清,对象及其映射如下: public class Parent { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual ISet<Child> Children
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);
}
}
在这里,newParent是一个临时对象(从早期会话中的数据库中获取,并在UI中显示),包含与我要更新的对象相同的标识符,但对子集合进行了更改。不知何故,使用这种方法,我只能添加子对象,而不能修改或删除它们
我的错误在哪里?最有可能发生在您身上的是,您没有修改NHibernate在父实体中实例化的集合,而是将其全部替换为
HashSet
的新实例
当您从NHibernate保存或获取实体时,您的子项ISet
将加载一个PersistentGenericSet
(实现ISet
)的实例,该实例负责帮助您的集合跟踪此更改
简而言之,不要指定给Children属性。事实上,要使setter受保护
。
只需根据需要添加()或删除()或清除()。我找到了这个()。我不确定它是否与您的问题完全相同,但它可能值得探讨。如果您使用Get()。
using (var tx = _session.BeginTransaction())
_session.Update(newParent);
tx.Commit();
}