できる限り単純化しようとしたシステムのシナリオがあります。アーティファクト (と呼びましょう) のテーブルがあり、アーティファクトには任意の数のセキュリティ ロールがアクセスでき、セキュリティ ロールは任意の数のアーティファクトにアクセスできます。そのため、データベースには 3 つのテーブルがあります。1 つはアーティファクトを記述し、もう 1 つはロールを記述し、アーティファクト ID をロール ID にリンクする多対多の関連付けテーブルです。
ドメインに関しては、ロール用とアーティファクト用の 2 つのクラスがあります。アーティファクト クラスには、それにアクセスできるロールのリストを返す IList プロパティがあります。(ただし、ロールは、アクセス可能なアーティファクトを取得するためのプロパティを提供しません)。
そのため、artefact の nhibernate マッピングには以下が含まれます。
<bag name="AccessRoles" table="ArtefactAccess" order-by="RoleID"
lazy="true" access="field.camelcase-underscore" optimistic-lock="false">
<key column="ArtefactID"/>
<many-to-many class="Role" column="RoleID"/>
</bag>
これはすべて正常に機能し、アーティファクトを削除すると、関連付けテーブルが適切にクリーンアップされ、削除されたアーティファクトとロールの間のすべての参照が削除されます (ロールは正しく削除されませんが、孤児を削除したくないため)。
問題は、ロールを削除して関連付けテーブルを自動的にクリアする方法です。現在ロールを削除しようとすると、ロールの関連付けテーブルにまだエントリがあるため、参照制約が発生します。ロールを正常に削除する唯一の方法は、そのロールにリンクしているすべてのアーティファクトを照会し、アーティファクトのロール コレクションからロールを削除し、アーティファクトを更新してからロールを削除することです。簡素化されたシステムで、ロールは他のテーブル/オブジェクトにいくつでも関連付けることができます。
ロールを削除するたびに、この関連付けテーブルをクリアしたいことを NHibernate に示唆できるようにする必要があります。これは可能ですか。
助けてくれてありがとう。