C# 无法删除集合:[NHibernate.Exceptions.GenericadException]

C# 无法删除集合:[NHibernate.Exceptions.GenericadException],c#,hibernate,nhibernate,hbm,C#,Hibernate,Nhibernate,Hbm,我有两张桌子,一张桌子和一张桌子 表A有列:tabAId、col2、col3(tabAId primaryKey和Identity列)。 tableB有列:tabAId,name(tabAId不为空) 我在表格的hbm文件中创建了包,以维护关系 <bag name="tableB" lazy="true" inverse="false" batch-size="25" cascade="all-delete-orphan"> <key

我有两张桌子,一张桌子和一张桌子

表A有列:tabAId、col2、col3(tabAId primaryKey和Identity列)。

tableB有列:tabAId,name(tabAId不为空)

我在表格的hbm文件中创建了包,以维护关系

<bag name="tableB" lazy="true" inverse="false"
                    batch-size="25" cascade="all-delete-orphan">
  <key column="tabAId" />
  <one-to-many class="tableB" />
</bag>

当我试图更新表A中的记录时,它抛出异常,因为我有表A实例中的子对象列表

[NHibernate.Exceptions.GenericADOException]={“无法删除集合:[MIHR.Entities.tableA.tableB#21][SQL:UPDATE dbo.tableB SET tabAId=null,其中tabAId=@p0]”}

InnerException={“无法将值NULL插入表'SA_MIHR_DEV.dbo.tableB'的列'tabAId'; 列不允许空值。更新失败。\r\n语句已终止。“}


只有两种方法可以解决这个问题

1) 不要使用
inverse=“false”

<bag name="tableB" lazy="true" inverse="true" // instead of false
                    batch-size="25" cascade="all-delete-orphan">
  <key column="tabAId" />
  <one-to-many class="tableB" />
</bag>

正如我们所见,我们明确地分配了关系的双方。这必须从NHibernate逆映射中获益。这也是一个很好的实践,因为稍后,当我们从DB加载数据时,我们希望NHibernate会注意为我们设置该值

如果我设置Inverse=“true”,那么它将不会将新生成的标识列值插入子表,而在父表中插入新记录。科勒:请告诉我怎么做,当我将设置
inversr=“true”
时。现在您应该看到。。。我更新了我的答案。当然,子实体必须具有对父实体的引用。检查所有细节Kohler:让我按您的方式来做。Kohler:1-当您尝试在列表中添加子项时,它将引发异常,因为您尚未初始化子对象。2-在子对象中添加父对象,它将创建循环引用。
Parent parent = new Parent();
Child child = new Child
{
    ...
    Parent = parent,
};
// unless initialized in the Parent type, we can do it here
parent.Children = parent.Children ?? new List<Child>();
parent.Children.Add(child);

// now just parent could be saved
// and NHibernate will do all the cascade as expected
// and because of inverse mapping - the most effective way
session.Save(parent);