NHibernate删除和添加父类的子集合

NHibernate删除和添加父类的子集合,nhibernate,parent-child,unique-index,Nhibernate,Parent Child,Unique Index,我有以下问题 我有一个包含子对象集合的父类 public class Parent{ int _id; IList<Child> _childs = new List<Child>(); public IList<Child> Childs {get;} } public class Child{ int _id; string _name; Parent _parent;

我有以下问题

我有一个包含子对象集合的父类

 public class Parent{

      int _id;
      IList<Child> _childs = new List<Child>();


      public IList<Child> Childs {get;}
 }

 public class Child{

      int _id;
      string _name;
      Parent _parent;

      protected Child(){}

      public Child(Parent parent, string name){
         _parent = parent;
         _name = name;
      }
 }
出现异常的原因是NHibernate首先插入child4,然后删除child1。NHibernate为什么这样做?
有人能解释一下并帮我解决这个问题吗?

SQL语句的顺序是NHibernate:

SQL语句按以下顺序发出

  • 所有实体插入,以相同的顺序插入相应的对象 已使用ISession.Save()保存

  • 所有实体更新

  • 所有收藏删除

  • 所有集合元素的删除、更新和插入

  • 所有集合插入

  • 所有实体删除,以相同的顺序删除相应的对象 已使用ISession.Delete()删除

NHibernate认为child的新实例实际上是一个新实体。所以它首先插入它,违反了数据库约束。这意味着您有两种选择:

1) 移除后和添加子对象前立即冲洗

2) 稍微修改一下设计,只需编辑子项,而不是删除/添加。这看起来更符合逻辑,因为它看起来像是一个通过名称标识的实体。不清楚您为什么实际添加和删除同一个子项:

Child child = parent.GetChildByName("Child1");
child.DoSomething();
或者像这样:

parent.DoSomethingWithChild("Child1");
另外,我假设您的Child.Equals实现使用名称,并且在您的映射中有
,而不是
。这可能只是一个打字错误

Child child = parent.GetChildByName("Child1");
child.DoSomething();
parent.DoSomethingWithChild("Child1");