Nhibernate -与Cascade all-delete-orphan的一对一映射,不删除孤儿

本文关键字:删除 映射 一对一 Cascade all-delete-orphan Nhibernate | 更新日期: 2023-09-27 17:50:23

我有一个'Interview'实体,它与'FormSubmission'实体有一对一的映射,可以说,Interview实体是主导方,映射是:

<class name="Interview">
    <id name="Id" column="Id" type="Int64">
        <generator class="identity" />
    </id>
    // other props (snip)....
    <one-to-one name="Submission" class="FormSubmission"
        cascade="all-delete-orphan" />
</class>
<class name="FormSubmission">
    <id name="Id" column="Id" type="Int64">
        <generator class="foreign">
            <param name="property">Interview</param>
        </generator>
    </id>
    // other props (snip)....
    <one-to-one name="Interview" class="Interview"
        constrained="true" cascade="none" />
</class>

两个实体都是聚合的一部分,面谈作为聚合根。我试图通过面试实体保存/更新/删除表单提交,因此我将关联的面试结束映射为cascade="all-delete-orphan"。例如,我可以像这样创建一个新的FormSubmission:

myInterview.Submission = new FormSubmission(myInterview);
InterviewRepository.Save(myInterview);

…这工作得很好,FormSubmission被保存了。然而,我似乎无法删除FormSubmission,我正试图这样做:

myInterview.Submission = null;
InterviewRepository.Save(myInterview);

…但这似乎并没有删除FormSubmission。我已经尝试将null赋值给关联的两边:

myInterview.Submission.Interview = null;
myInterview.Submission = null;
InterviewRepository.Save(myInterview);

我甚至尝试在FormSubmission端设置cascade="all-delete-orphan",但似乎没有任何效果。我错过了什么?

Nhibernate -与Cascade all-delete-orphan的一对一映射,不删除孤儿

可能这不是你想要的答案。根据此问题:https://nhibernate.jira.com/browse/NH-1262,主键一对一关联不支持All-delete-orphan级联。即使是外键一对一关联也很可能忽略"all-delete-orphan"级联:

<class name="Interview">
    <id name="Id" column="Id" type="Int64">
        <generator class="identity" />
    </id>
    <property name="Name" />
    <many-to-one name="Submission" unique="true" cascade="all-delete-orphan" />
</class>
<class name="FormSubmission">
    <id name="Id" column="Id" type="Int64">
        <generator class="identity" />
    </id>
    <property name="Name" />
    <one-to-one name="Interview" cascade="all-delete-orphan" property-ref="Submission"  />
</class>

编辑:jchapman建议使用拦截器(事件监听器在NH2中更受欢迎)。这个功能听起来很有趣,但我还不清楚如何实现这样的拦截器/事件监听器