13

多くのユーザーグループを持つユーザーを削除したいのですが、それらのユーザーグループはこのユーザー専用ではありません。他のユーザーもこのユーザーグループを使用できます。また、ユーザーグループは、参照するユーザーがいない場合でも存在できます。

多対多の関係をマッピングして、ユーザーが削除された場合、関係は自動的に削除されますが、ユーザーグループは削除されないようにしたいですか?

Cascade.All多対多のカスケードは関係に影響を与えますが、反対側には影響を与えないと思ったので、試しました。Cascade.AllDeleteOrphan反対側の削除しかできないと思いました。明らかに私は間違っています。

カスケードルールがよくわからないようです。誰かが私に明確な説明を提供し、おそらく私の目標を達成する方法も提供できますか?

ありがとう

4

1 に答える 1

13

NHibernatemany-to-manyの関係は、私たちが期待するものを提供します。それについて詳しく説明します。UserGroupの2つのエンティティのみが必要ですが、3つのテーブルが必要になります:User、、(列はUserIdGroupIdGroupUserGroup

C#エンティティ:

public class User {
   IList<Group> Groups {get;set;}
}

public class Group{
   IList<User> Users{get;set;}
}

hbm.xmlマッピングは次のようになります。

<class name="User" ...    
  <bag name="Groups" lazy="true" 
       table="UserGroup" cascade="none" >
    <key column="UserId" />
    <many-to-many class="Group" column="GroupId" />
  </bag>
  ...

<!-- and group vica versa -->

<class name="Group" ...
  <bag name="Users" lazy="true" 
       table="UserGroup" cascade="none" >
     <key column="GroupId" />
     <many-to-many class="User" column="UserId" />
  </bag>
    ...

重要な設定を使用したこのマッピングは、cascade="none"期待される動作を実行します。このマッピングは、エンティティ表現を持たないPairTableがあることを示しています。 UserGroupしたがって、このテーブルに影響を与えるカスケード設定はありません。このテーブルは、舞台裏で隠されて使用されます。

ペアテーブル

一部のユーザーが削除されると、NHibernateはテーブルからすべてのリレーションも削除しUserGroupます(実際、これはバッチの最初のステートメントになります)。これは、リレーショナル参照制約の処理にすぎません。テーブルに外部キーがないUserIdテーブルには、何も残せません。UserGroupsUser

もう一方の関係の終わり

最後に、カスケード設定:UserGroupテーブルは注意を払わずに管理されるため、この場合、カスケードはエンティティGroup(もう一方のリレーションエンド)に適用されます。したがって、all-delete-orphanに設定すると、相互参照されたすべてのレコードが完全に削除される可能性があります。

概要:bagwithmany-to-manyリレーションのカスケードは、ペアリングテーブルではなく、もう一方のエンドポイントを対象としています。

于 2012-11-20T11:50:42.057 に答える