多对多:删除一面,关系条目,但不删除对方(Many to Many: Delete one side

2019-08-02 23:42发布

我想删除其中有许多用户组的用户,但这些用户组不exclusivly属于该用户:其他用户也可以使用这个用户组。 和用户组可以在没有用户引用它们甚至存在。

我要映射的许多一对多的关系,所以,如果用户被删除 ,该关系被自动删除 不是用户组

我想Cascade.All ,因为我以为级联许多一对多的影响关系,但不是对方。 我以为只有Cascade.AllDeleteOrphan会做阿瑟赛德删除。 显然我错了。

看来,我不明白级联规则的权利。 有人可以提供一个明确的解释给我,也许也是一个办法达到我的目标?

谢谢

Answer 1:

NHibernate的many-to-many关系,并提供我们所期望的,让我更详细解释。 虽然我们只需要两个实体用户 ,我们将需要三个表: UserGroupUserGroup (与列用户ID, 的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 ,不具有任何的实体表示。 因此,不能有任何级联设置实现此表。 此表用于hiddenly幕后。

对表

当某个用户被删除,则NHibernate的将ASLO删除所有从关系UserGroup表(实际上这将是该批次的第一个语句)。 这只是关系基准约束处理 。 我们不能让任何UserId在该表UserGroups ,它没有在它的外键User表。

另一端关系

最后级联设置:由于UserGroup表没有任何我们关注管理, 级联在这种情况下应用到实体Group -其他关系结束。 所以,将其设置为全删除,孤儿可能导致的所有交叉引用的记录彻底删除。

总结:级联bagmany-to-many关系,是为另一端点,不配对表。



文章来源: Many to Many: Delete one side, the relationship entry BUT don't delete the other side