0

没有为我们的实体类的一个后续的简化映射:级联删除可选逆加入

<class name="Parent" table="tParent"> 
    <id name="Id"> 
     <column name="ParentId" sql-type="bigint"/> 
     <generator class="native"/> 
    </id> 
    <join table="tOneToOneComponent" optional="true" inverse="true"> 
     <key column="ParentId" on-delete="cascade"/> 
     <property name="Someprop"/> 
    </join> 
    </class> 

基本上,它是一个对一个从关系的另一侧的外键(这是为什么我们设置“反向”)。另外,Parent可能在tOneToOneComponent中没有任何记录(所以可选的=“true”)。

我知道,这样的连接不被推荐,但是我们有一个老大的系统,我们没有时间去重新设计它。

当Parent被删除时,我们希望NHibernate删除相关的tOneToOneComponent。

当然,我们可以级联SQL服务器上的删除操作,但是我们需要清除NHibernate缓存以确保tOneToOneComponent不会保留在缓存中的某个位置。

所以我们增加了上删除=“级联”的,但现在,当我们删除父,SQL说:

The DELETE statement conflicted with the REFERENCE constraint 

看来,NHibernate的是试图以错误的顺序删除记录。

如何告诉NHibernate首先删除tOneToOneComponent(如果存在),然后才删除父项?

回答

1

你想要的是默认的行为,它是由Inverse()指定的,它告诉它它不必删除其他部分,因为它拥有自己。要么摆脱反向()或以另一种方式处理删除。