13

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

我想映射多对多关系,以便如果删除用户关系会自动删除,而不是用户组

我尝试Cascade.All了,因为我认为多对多的级联会影响关系,但不会影响另一方。我以为只会Cascade.AllDeleteOrphan做对方删除。显然我错了。

看来我不理解级联规则。有人可以向我提供一个明确的解释,也许还能达到我的目标吗?

谢谢

4

1 回答 1

13

NHibernatemany-to-many关系确实提供了我们所期望的,让我更详细地解释一下。虽然我们只需要两个实体UserGroup,但我们将需要三个表:User, Group, UserGroup(带有列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表中删除所有关系(实际上这将是批处理中的第一条语句)。这只是关系引用约束处理。我们不能在 table 中留下任何,它UserId在 tableUserGroups中没有其外键User

另一方关系结束

最后是级联设置:因为UserGroup表是在没有我们注意的情况下管理的,所以在这种情况下级联应用于实体Group- 另一个关系端。因此,将其设置为 all-delete-orphan 可能会导致完全删除所有交叉引用的记录。

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

于 2012-11-20T11:50:42.057 回答