【问题标题】:NHibernate prevent cascade deleteNHibernate 防止级联删除
【发布时间】:2012-10-02 14:19:23
【问题描述】:

假设我有一个类 Foo。我还有一个关于 Foo 的 view,名为 Foo_Foo,它列出了 Foo 之间的多对多关联。我将此关联映射为每个 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 尝试删除与视图的关联?

【问题讨论】:

    标签: nhibernate cascade nhibernate-cascade


    【解决方案1】:

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

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


    在理解问题后编辑。

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

    为避免集合表的插入/更新和删除,您可以尝试以下方法之一:

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

    【讨论】:

    • Foo_Foo 不包含记录,它是 Foo 表上的一个视图。 Foos 之间的关系是通过 NHibernate 之外的某种方式计算的,并在此视图中表示(它们不通过外键表示)。正如我在映射文件中指定的那样,该视图不应接收保存/更新/删除级联,但 NHibernate 正试图从该视图中删除。我在问如何阻止这种情况。
    • 现在我明白了。我仔细想想。肯定有解决办法。
    • 1+ 这个答案。我遇到了同样的情况,即映射一个视图,并设置inverse="true" 阻止 NHibernate 在删除父级时将删除级联到我的视图。
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多