4

「写真」クラスと「コメント」クラスがあります。写真には複数のコメントを割り当てることができます。

これをHBMマッピングファイル内で1対多の関係として構成し、Photo.hbm.xmlマッピングファイル内の「コメント」バッグに対してcascade="all-delete-orphan"を設定しました。

ただし、1つ以上のコメントが関連付けられている写真を削除しようとすると、「DELETEステートメントがREFERENCE制約「FK_Comments_Photos」と競合しています」というメッセージが表示されます。

Photo.hbm.xmlのコメントバッグに対して他のいくつかのカスケードオプションを試しましたが、設定内容に関係なく、毎回同じ結果が得られます。写真を削除して、関連するコメントも自動的に削除できるようにしたいだけです。

これが私の写真のマッピングです(簡潔にするために編集):

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" .... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Photo" table="Photos">
    <id name="PhotoId" unsaved-value="0">
        <column  name="PhotoId" />
        <generator class="native" />
    </id>
    ...
    <bag name="Comments" table="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1">
        <key column="PhotoId" />
        <one-to-many class="Comment" />
    </bag>
</class>

これが私のコメントマッピングです(簡潔にするために編集):

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Comment" table="Comments">
    <id name="CommentId" unsaved-value="0">
        <column name="CommentId"></column>
        <generator class="native" />
    </id>
    ...
    <property name="Author" not-null="true" />
    <property name="Body" not-null="true" />
    <property name="Approved" not-null="true" />
    <many-to-one name="Photo" not-null="true">
        <column name="PhotoId" />
    </many-to-one>
</class>

コメントが関連付けられた写真を削除しようとすると、カスケードが発生しない理由について誰かが提案を持っていますか?

更新:カスケードを発生させる唯一の方法は、SQL Server内で「カスケード」とのこの関係に対して「ルールの削除」を構成することです。そうすることで、NHibernate内でカスケードアクションを指定する必要がなくなります。マッピング。ただし、これは私にとって理想的ではありません-NHibernateマッピング内でカスケード動作を理想的に構成できるようにしたいので、NHibernateに注意を払っていないように見える理由についてはまだ混乱していますカスケード設定?

4

4 に答える 4

4

私の推測では、問題はコメントマッピングの多対1がnot-null="true"に設定されているという事実に起因していると思います。そのため、NHibernateはPhotoオブジェクトを削除する前に、このプロパティを一時的にnullに設定することはできません。したがって、Photoオブジェクトを削除しようとすると、SQLServerは外部キー例外をスローします。

削除するときのアクションの順序を正しく覚えている場合は、次のとおりです。

  1. すべての子オブジェクトで外部キー値をnullに設定します
  2. 親オブジェクトを削除する
  3. すべての子参照を削除します

多対多からnot-null="true"を削除して、何が起こるかを確認してください。

于 2011-01-21T12:35:05.280 に答える
2

inverse="true"マッピングのバッグコレクションを試してみてください。

于 2011-01-21T09:13:16.867 に答える
1

私は1日間同様の問題を抱えていました..そしてそれに不満を感じました。

最後に、ソリューションはDBに要約されます。「INSERTUPDATESPECIFICATION」の「DeleteRule」のFKキー制約を「NoAction」から「Cascade」に変更する必要がありました。

さらに、「ルールの更新」を「アクションなし」から「カスケード」に設定することもできます

于 2011-05-17T06:29:13.317 に答える
0

NHでdelete-cascadeオプションを指定できます。

<bag name="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1">
    <key column="PhotoId" on-delete="cascade"/>
    <one-to-many class="Comment" />
</bag>

おそらく逆にする必要があります。次に、FK_Comments_Photos列がどこに指定されているのでしょうか。

于 2011-06-28T12:12:05.763 に答える