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



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

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

我尝试了Cascade.All,因为我认为级联对多会影响关系,但不会影响另一面。我以为只有Cascade.AllDeleteOrphan才能完成另一侧的删除。显然我错了。

我似乎不太理解级联规则。有人能给我一个明确的解释,也许还有一种达到我目标的方法吗?

感谢

NHibernatemany-to-many关系确实提供了我们所期望的,让我更详细地解释一下。虽然我们只需要两个实体UserGroup,但我们需要三个表:UserGroupUserGroup(列UserIdGroupId)

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"的映射将执行预期行为。这个映射表示存在一个PairTableUserGroup,它没有任何实体表示。因此,不可能有任何级联设置影响此表。此表隐藏在场景后面使用。

配对表

当某个用户被删除时,NHibernate也将从UserGroup表中删除所有关系(事实上,这将是批处理中的第一条语句)。这只是关系引用约束处理。我们不能在UserGroups表中保留任何UserId,因为它在User表中没有外键。

其他关系结束

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

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

相关内容

  • 没有找到相关文章

最新更新