2015-05-05 103 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瞭解詳情 –