5

「FormSubmission」エンティティと1対1のマッピングを持つ「Interview」エンティティがあります。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>

両方のエンティティは、インタビューがアグリゲートルートとして機能するアグリゲートの一部です。Interviewエンティティを介してFormSubmissionを保存/更新/削除しようとしているため、関連付けのInterviewの終わりを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"を設定しようとしましたが、何も機能しないようです。私は何が欠けていますか?

4

1 に答える 1

6

おそらくこれはあなたが望む答えではありません。この問題によると、「All-delete-orphan」カスケードは主キーの1対1の関連付けではサポートされていません:https ://nhibernate.jira.com/browse/NH-1262 。外部キーの1対1の関連付けでさえ、「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.x以降ではイベントリスナーがより好まれます)を使用することを提案していますが、このようなインターセプター/イベントリスナーを実装する方法はまだ明確ではありません。

于 2011-04-18T17:16:15.577 に答える