多对多:删除一方,关系条目但不删除另一方

时间:2012-11-20 10:09:34

标签: nhibernate many-to-many cascade nhibernate-cascade

我想删除一个拥有多个用户组的用户,但这些用户组不属于该用户:其他用户也可以使用此用户组。即使没有用户引用用户组,也可以存在用户组。

我想映射多对多关系,以便在用户被删除时,关系会自动删除,但 NOT < / em>用户组

我试过Cascade.All,因为我认为多对多的级联会影响关系但不会影响另一方。我以为只有Cascade.AllDeleteOrphan才会删除其他内容。显然我错了。

似乎我不理解级联规则。有人可以向我提供明确的解释,也许也可以达到我的目标吗?

由于

1 个答案:

答案 0 :(得分:12)

NHibernate many-to-many关系提供了我们期望的内容,让我更详细地解释一下。虽然我们只需要两个实体用户,但我们需要三个表:UserGroupUserGroup(带列 UserId GroupId

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可能会导致完全删除所有交叉引用的记录。

摘要:具有bag关系的many-to-many上的级联是针对另一个终点,而不是配对表。