gpt4 book ai didi

c# - NHibernate 中的多对多删除级联

转载 作者:可可西里 更新时间:2023-11-01 07:57:57 25 4
gpt4 key购买 nike

我在一个系统中有一个场景,我试图尽可能地简化它。我们有一个(让我们称之为)人工制品表,人工制品可以被任意数量的安全角色访问,安全角色可以访问任意数量的人工制品。因此,我们在数据库中有 3 个表 - 一个描述人工制品,一个描述角色和一个将人工制品 ID 链接到角色 ID 的多对多关联表。

在领域方面,我们有两个类 - 一个用于角色,一个用于人工制品。 artefact 类有一个 IList 属性,该属性返回可以访问它的角色列表。 (然而,角色不提供属性来获取可以访问的人工制品)。

因此,artefact 的 nhibernate 映射包含以下内容;

<bag name="AccessRoles" table="ArtefactAccess" order-by="RoleID" 
lazy="true" access="field.camelcase-underscore" optimistic-lock="false">
<key column="ArtefactID"/>
<many-to-many class="Role" column="RoleID"/>
</bag>

这一切都很好,如果我删除一个人工制品,关联表会被适本地清理,并且被删除的人工制品和角色之间的所有引用都被删除(虽然角色没有被删除,正确的 - 因为我们不想要孤儿已删除)。

问题是——如何删除角色并让它自动清除关联表。如果我现在尝试删除一个角色,我会得到一个引用约束,因为该角色的关联表中仍然有条目。成功删除角色的唯一方法是查询链接到该角色的所有人工制品,从人工制品的角色集合中删除角色,更新人工制品,然后删除角色——效率不高或不好,尤其是在非简化的系统,角色可以与任意数量的其他表/对象相关联。

我需要能够向 NHibernate 提示我希望在删除角色时清除此关联表 - 这可能吗?如果可以 - 我该怎么做?

感谢您的帮助。

最佳答案

因为我一直在寻找这个答案并在谷歌上找到了这个线程(没有答案)我想我应该发布我的解决方案。具有三个表:Role、RolesToAccess(ManyToMany)、Access。

创建以下映射:访问:

<bag name="Roles" table="RolesToAccess" cascade="none" lazy="false">
<key column="AccessId" />
<many-to-many column="AccessId" class="Domain.Compound,Domain" />
</bag>

<bag name="RolesToAccess" cascade="save-update" inverse="true" lazy="false">
<key column="AccessId" on-delete="cascade" />
<one-to-many class="Domain.RolesToAccess,Domain" />
</bag>

角色:

<bag name="Accesses" table="RolesToAccess" cascade="none" lazy="false">
<key column="RoleId" />
<many-to-many column="RoleId" class="Domain.Compound,Domain" />
</bag>

<bag name="RolesToAccess" cascade="save-update" inverse="true" lazy="false">
<key column="RoleId" on-delete="cascade" />
<one-to-many class="Domain.RolesToAccess,Domain" />
</bag>

如上所述,您可以保护 RolesToAccess 属性,这样它们就不会污染您的模型。

关于c# - NHibernate 中的多对多删除级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/212968/

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