Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用子集合更新NHibernate对象_C#_Nhibernate_Fluent Nhibernate_Nhibernate Mapping - Fatal编程技术网

C# 使用子集合更新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

我正在尝试使用hibernate会话中的.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);        
   }
}
在这里,newParent是一个临时对象(从早期会话中的数据库中获取,并在UI中显示),包含与我要更新的对象相同的标识符,但对子集合进行了更改。不知何故,使用这种方法,我只能添加子对象,而不能修改或删除它们


我的错误在哪里?

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

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

简而言之,不要指定给Children属性。事实上,要使setter
受保护
。 只需根据需要添加()或删除()或清除()。

我找到了这个()。我不确定它是否与您的问题完全相同,但它可能值得探讨。如果您使用
Get()。
using (var tx = _session.BeginTransaction())
     _session.Update(newParent);
     tx.Commit();
}