NHibernate防止级联删除

NHibernate防止级联删除,nhibernate,cascade,nhibernate-cascade,Nhibernate,Cascade,Nhibernate Cascade,假设我有一门课。我还有一个关于Foo的视图,名为Foo\u Foo,它列出了Foo之间的多对多关联。我使用cascade=“none”将此关联映射为每个Foo上的一个简单不可变集: 然而,当我试图删除一个Foo时,NHibernate试图删除Foo.association,但没有成功 如何防止NHibernate尝试删除与视图的关联?该集合属于Foo。您无法共享该集合,因此无需将其保留在数据库中。级联用于告知NH是否也应删除引用的Foos 为什么要将Foo\u Foo记录保存在数据库中?如果

假设我有一门课。我还有一个关于Foo的视图,名为Foo\u Foo,它列出了Foo之间的多对多关联。我使用cascade=“none”将此关联映射为每个Foo上的一个简单不可变集:


然而,当我试图删除一个Foo时,NHibernate试图删除Foo.association,但没有成功


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

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

为什么要将
Foo\u Foo
记录保存在数据库中?如果这应该是一个双向的多对多自引用,那么它就不是这样工作的


理解问题后进行编辑

级联在您的情况下不起作用,因为它只影响引用的foo

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

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

Foo\u Foo不包含记录,它是Foo表上的一个视图。FOO之间的关系通过NHibernate之外的某种方式计算,并在此视图中表示(它们不通过外键表示)。正如我在映射文件中指定的那样,此视图不应接收save/update/delete级联,但NHibernate正在尝试从此视图中删除。我在问如何阻止这一切,现在我明白了。我想了想。当然有一个解决办法。1+这个答案。我遇到了相同的情况,即映射视图,并设置
inverse=“true”
在删除父视图时停止NHibernate将删除内容级联到我的视图。
<set name="association" table="Foo_Foo" cascade="none" mutable="false">
  <key column="ParentFoo" />
  <many-to-many class="Foo, MyAssembly" column="BaseFoo" />
</set>