0

エンティティ クラスの 1 つに対する次の簡略化されたマッピングがあります。

 <class name="Parent" table="tParent">
    <id name="Id">
      <column name="ParentId" sql-type="bigint"/>
      <generator class="native"/>
    </id>
    <join table="tOneToOneComponent" optional="true" inverse="true">
      <key column="ParentId" on-delete="cascade"/>
      <property name="Someprop"/>
    </join>
  </class>

基本的には、関係の反対側からの外部キーと 1 対 1 です (そのため、「逆」を設定します)。また、Parent は tOneToOneComponent にレコードを持たない場合があります (したがって、optional="true" になります)。

このような結合はお勧めできませんが、少し古くて大規模なシステムがあり、再設計する時間がありません。

Parent が削除されたときに、NHibernate が関連する tOneToOneComponent を削除するようにします。

もちろん、SQL サーバーで削除操作をカスケードすることもできますが、tOneToOneComponent がキャッシュ内のどこかに留まらないように、NHibernate キャッシュをクリアする必要があります。

そのため、on-delete="cascade" を追加しましたが、親を削除すると、SQL は次のように言います。

The DELETE statement conflicted with the REFERENCE constraint

NHibernate が間違った順序でレコードを削除しようとしているようです。

最初に tOneToOneComponent を削除し (存在する場合)、次に親を削除するように NHibernate に指示する方法は?

4

1 に答える 1

1

あなたが望むのは、Inverse() によってオーバーライドされるデフォルトの動作です。これは、自分自身を所有しているため、他の部分をまったく削除してはならないことを示しています。Inverse() を取り除くか、別の方法で削除を処理してください。

于 2012-07-31T11:46:30.883 に答える