gpt4 book ai didi

nhibernate - 多对多 : Delete one side, 关系条目但不要删除对方

转载 作者:行者123 更新时间:2023-12-03 23:48:10 25 4
gpt4 key购买 nike

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

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

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

似乎我对级联规则的理解不正确。有人可以向我提供清楚的解释,也许还可以提供一种实现我的目标的方法吗?

谢谢

最佳答案

NHibernate many-to-many关系确实提供了我们所期望的,让我更详细地解释一下。虽然我们只需要两个实体 用户 ,我们需要三个表: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 ,它没有任何实体表示。因此,不能有任何影响此表的级联设置。这张 table 被隐藏在幕后使用。

双表

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

对方关系结束

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

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

关于nhibernate - 多对多 : Delete one side, 关系条目但不要删除对方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13470869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com