无法删除集合:[NHibernate.Exceptions.GenericADOException]

时间:2015-05-05 06:25:51

标签: c# hibernate nhibernate hbm

我有两个表,tableA和tableB。

tableA有列:tabAId,col2,col3 (tabAId primaryKey和Identity列。)

tableB有列:tabAId,名称(tabAId不为空)

我在tableA的hbm文件中创建了Bag,以维护关系。

@model List<string>

@foreach (var item in Model)
{
    @Html.DisplayFor(modelitem => item)
}

当我尝试更新 tableA 中的记录时,它会抛出异常,因为我在tableA实例中有子列表。

  

[NHibernate.Exceptions.GenericADOException] = {&#34;无法删除集合:[MIHR.Entities.tableA.tableB#21] [SQL:UPDATE dbo.tableB SET tabAId = null WHERE tabAId = @ p0]& #34;}

     

InnerException = {&#34;无法将值NULL插入列&tab;条形码&#39;,表&#39; SA_MIHR_DEV.dbo.tableB&#39 ;;                               列不允许空值。更新失败。\ r \ n语句已终止。&#34;}

1 个答案:

答案 0 :(得分:10)

解决这个问题的方法只有两种。

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>

此设置(inverse =&#34; true&#34;)将指示NHibernate直接从DB中删除

虽然使用inverse="false"通常会导致:

  • UPDATE(with null)==从集合中删除的行为
  • 删除项目==级联行为

2)使引用列可以为空

这意味着,我们可以让NHibernate进行UPDATE和DELETE。因为列现在可以为空。

这只是解决问题的两种方法。

我的偏好是: inverse =&#34; true&#34;

要正常使用 inverse="true" ,我们必须在C#中指定关系的两面。这是Add(),INSERT操作的必备条件:

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);

正如我们所看到的,我们明确地指定了 - 关系的两个方面。这必须从NHibernate逆映射中获益。这也是一种很好的做法,因为稍后,当我们从数据库加载数据时,我们期望NHibernate会为我们设置这个数据