级联删除可选的反向连接

时间:2012-07-31 11:16:36

标签: join nhibernate cascading-deletes inverse nhibernate-cascade

我们的一个实体类有以下简化映射:

 <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”)。

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

我们希望NHibernate在删除Parent时删除相关的tOneToOneComponent。

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

所以我们添加了on-delete =“cascade”但是现在当我们删除一个Parent时,SQL说:

The DELETE statement conflicted with the REFERENCE constraint

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

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

1 个答案:

答案 0 :(得分:1)

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