3

クラスFooがあるとします。また、Foo_Fooと呼ばれるFooについての見解があり、Foos間の多対多の関連付けがリストされています。この関連付けを、cascade = "none"を使用して、各Fooの単純な不変セットとしてマッピングしました。

<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がビューへの関連付けを削除しようとするのを防ぐにはどうすればよいですか?

4

1 に答える 1

2

コレクションは に属していFooます。コレクションは共有できないため、データベースに保持する必要はありません。カスケードは、参照されたFoos も削除する必要があるかどうかを NH に通知するために使用されます。

Foo_Fooレコードをデータベースに保持する必要があるのはなぜですか? これが双方向の多対多の自己参照である必要がある場合、このようには機能しません。


質問を理解した後、編集します。

カスケードは、参照されている Foos のみに影響するため、この場合は機能しません。

コレクション テーブルの挿入/更新および削除を回避するには、次のいずれかを試してください。

  • 最初の明らかな試みはmutable="false"で、既に試しました。なぜ機能しないのか、よくわかりません。Nhibernate ユーザー グループで質問することができます。
  • あまり明白ではありませんが、有望なのはinverse="true"です。Inverse は、コレクションが別の場所にマップされており、ここから格納する必要がないことを NH に伝えます。したがって、挿入は省略されますが、削除についてはわかりません。
  • これが機能しない場合は、より複雑なソリューションを検討する必要があります。Foos を参照する中間エンティティの 1 対多としてマップできます。中間エンティティは、ビューへのマッピングです。これは不変です (削除ステートメントにつながる可能性があります)。この場合、cascade="false"動作します (参照エンティティであるため)。挿入、更新、および削除の sql ステートメント (空) の構成も機能しますが、これはおそらく必要ありません。
于 2012-10-03T05:50:21.660 に答える