2012-03-26 73 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