2012-03-26 33 views
0

SQL服務器:試圖刪除刪除NHibernate的收集與檢查約束

表名稱:爸爸 領域:身份證

表名:媽媽 領域:身份證

表名: 場:ID,IdDad,IdMom

兒童檢查約束:IdDad不爲空或IdMom不爲空

NHibernate的映射類

public class ChildBase 
{ 
    public int Id { get; set; } 
} 

public class DadChild : ChildBase 
{ 
    public int IdDad { get; set; } 
} 

public class MomChild : ChildBase 
{ 
    public int IdMom { get; set; } 
} 

public class Dad 
{ 
    public int Id { get; set; } 

    // Cascade = All, Table = "Child", ColumnKey = "Id" 
    public IList Children { get; set; } 

} 

如果我有爸爸反對兒童收集有3個孩子我刪除,並刪除兒童

foreach (Child child in Dad.Children) 
{ 
    child.Delete(); 
} 

Dad.Children.Clear(); 

Data.Flush(); 

我得到的約束違反錯誤,因爲試圖刪除兒童在從父親那裏,約束表明Child表不能有IdDad和IdMom爲空。

NHibernate的嘗試做這樣的更新:

幼兒更新設置IdDad = NULL其中Id = XXX

由於IdMom目前爲空,也不能IdDad和IdMom空,我該怎麼刪除從NHibernate的兒童收集?

CNC中

<class name="Dad, MyAssembly" table="Dad" lazy="true"> 
    <id name="Id" access="property" column="Id" type="Int32" unsaved-value="0"> 
     <generator class="native"> 
     </generator> 
    </id> 
    <bag name="Children" access="property" table="Child" lazy="true" cascade="all" > 
     <key column="IdDad" /> 
     <one-to-many class="Child, MyAssembly" /> 
    </bag> 
</class> 
+0

發表您的'Dad' – 2012-03-26 15:30:05

回答

1

,如果你想刪除的實體以這種方式你應該在你的集合映射使用inverse="true"

<bag name="Children" access="property" inverse="true" table="Child" lazy="true" cascade="all" > 
    <key column="IdDad" /> 
    <one-to-many class="Child, MyAssembly" /> 
</bag> 

Inverse Attribute in NHibernate

+0

感謝名單映射,做工精細 – manuellt 2012-03-28 09:02:31