很多人在NHibernate中删除了级联

dee*_*.uk 14 c# nhibernate many-to-many

我在一个系统中有一个场景,我尽可能地尽量简化.我们有一个(让我们称之为)人工制品的表格,可以通过任意数量的安全角色访问人工制品,安全角色可以访问任意数量的人工制品.因此,我们在数据库中有3个表 - 一个描述人工制品,一个描述角色,一个多对多关联表将人工制品ID与角色ID相关联.

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

因此,人工制品的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>
Run Code Online (Sandbox Code Playgroud)

这一切都运行良好,如果我删除一个人工制品,关联表将被适当地清理,删除的人工制品和角色之间的所有引用都将被删除(虽然正确地删除了角色 - 因为我们不想删除孤儿).

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

我需要能够向NHibernate提示我希望每当我删除一个角色时都要清除这个关联表 - 这是可能的,如果可以的话 - 我该怎么做?

谢谢你的帮助.

小智 8

由于我正在寻找这个答案并在谷歌上找到这个帖子(没有回答)我想我会发布我的解决方案.有三个表: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>
Run Code Online (Sandbox Code Playgroud)

角色:

<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>
Run Code Online (Sandbox Code Playgroud)

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