NHibernate防止级联删除

时间:2012-10-02 14:19:24

标签: nhibernate cascade nhibernate-cascade

假设我有一个Foo类。我在Foo上有一个名为Foo_Foo的 视图 ,它列出了Foos之间的多对多关联。我将这个关联映射为每个Foo上的一个简单的不可变集合,cascade =“none”:

<set name="association" table="Foo_Foo" cascade="none" mutable="false">
  <key column="ParentFoo" />
  <many-to-many class="Foo, MyAssembly" column="BaseFoo" />
</set>

然而,当我尝试删除Foo时,NHibernate尝试并且正确地无法删除Foo.association。

如何阻止NHibernate尝试删除与视图的关联?

1 个答案:

答案 0 :(得分:2)

该集合属于Foo。您无法共享该集合,因此无需将其保留在数据库中。 Cascade用于告知NH是否也应删除引用的Foo

为什么要将Foo_Foo记录保留在数据库中?如果这应该是双向的多对多自引用,它就不会像这样工作。


在理解了问题之后编辑。

Cascade在您的情况下不起作用,因为它仅影响引用的Foos。

要避免对集合表进行插入/更新和删除,可以尝试以下操作之一:

  • 首先明显的尝试是mutable="false",您已经尝试过了。我真的不明白为什么它不起作用。您可以在Nhibernate用户组中询问。
  • 不太明显,但有希望的是inverse="true"。 Inverse告诉NH,集合被映射到其他地方,不需要从这里存储。所以它只是省略了插入,但我不知道删除。
  • 如果这不起作用,您需要探索更复杂的解决方案。您可以将其映射为引用Foos的一对多中间实体。中间实体是视图的映射。它是不可变的(仍然可能导致删除语句)。在这种情况下,cascade="false"将起作用(因为它是引用的实体)。它还可以配置插入,更新和删除sql语句(它们都是空的),但这很可能甚至不是必需的。