2015-05-05 76 views
5

我有两个表tableA和tableB。无法删除集合:[NHibernate.Exceptions.GenericADOException]

TableA的有柱:tabAId,COL2,COL3 (tabAId的PrimaryKey和标识列。)

tableB的有柱:tabAId,名(tabAId不为null)

我已创建袋在tableA的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 WHERE tabAId = @ P0]” }

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

回答

8

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

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的可以直接从数据库中删除项目

在使用inverse="false"将一般总是导致:

  • UPDATE(与空)==从集合中移除
  • 删除项目的行为==级联的行为

2)使参考列可为空

这意味着,我们可以离开NHibernate做UPDATE和DELETE。因为列现在可以为空。

这些只是两种方法,在这里如何解决它。

我更倾向于将:逆=“真”

要与inverse="true"正常工作,我们总是要在C#中分配关系的两侧。这是添加必须的(),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会照顾为我们设置

+1

如果我设置Inverse =“true”,那么它不会插入新生成的标识列值插入子表中,同时在父表中插入新记录。 –

+0

科勒:请告诉我该怎么做,我什么时候设置'inversr =“true”'。 –

+0

现在你应该看到...我更新了我的答案。当然,您的孩子实体必须提及父母。查看http://stackoverflow.com/a/30005490/1679310了解详情 –