【问题标题】:Many to many with implied and explicit relationships具有隐含和显式关系的多对多
【发布时间】:2011-10-10 15:08:45
【问题描述】:

我的数据库中的 Person 和 Widget 之间有一个标准的多对多关系。具有管理角色的人员可以访问所有小部件。在我的应用程序中,我想查看 Person 可以访问哪些小部件。

我有两个高级选项:

  1. 明确管理关系。当一个人成为管理员时,将该人与所有现有的小部件相关联。创建 Widget 后,将该 Widget 与所有现有管理员关联。

  2. 在运行时,如果 Person 是管理员,假设他们可以访问所有小部件并在加载小部件时绕过关系表。

一种选择比另一种更好吗?这个场景有名字吗?

我一直在尝试使用 NHibernate 应用选项 2,但在加载实体的所有小部件时,我似乎无法弄清楚如何让它绕过关系表(即使我可以,这也会不必要地加载很多除非我从 Person 实体单独加载小部件并应用分页)。

【问题讨论】:

    标签: nhibernate many-to-many entity-relationship


    【解决方案1】:

    我必须分享最终解决方案 - 应该可以帮助任何试图强制 NH 加载数据库中不明确的关系的人。

    我已经创建了 person 的子类,NHibernate 足够聪明,可以识别 Administrator : Person 并将该 Person 实例化为 Administrator(其中 Administrator 有一个带有 PK/FK PersonId 的表)

    我刚刚为管理员添加了一个新的映射覆盖...

    mapping.HasManyToMany(x => x.Widgets)
      .Table("AdministratorWidgetAccess")
      .Cascade.None();
    

    我添加了一个名为 AdministratorWidgetAccess 的视图...

    SELECT a.PersonId as [AdministratorId], w.WidgetId as 
    FROM dbo.Administrator AS a LEFT OUTER JOIN
      dbo.Widget AS w ON 1 = 1
    

    运行时,如果Person是Administrator,则根据视图中的关系加载所有Widget,否则根据连接表加载Widget。

    【讨论】:

      【解决方案2】:

      我会通过角色来映射它。

      角色:人 = 1:许多

      因此,当您创建一个人时,您还创建了一个新角色,除非他们是管理员,在这种情况下他们使用现有的管理员角色。

      那么问题就很简单了:你需要一个 WidgetRole 表。

      当一个新的 Widget 被创建,并且条目被自动添加到 NewWidget 的 WidgetRole 表中,AdminRole

      当人员更改为管理员角色时,只需更改其当前角色即可。

      这个设置在逻辑上比有一个特殊的管理员案例更简单。

      【讨论】:

      • Person-Widget 超出了我的控制范围 - 但我可以添加 Role-Widget 关系,并在 Person 上拥有一个合并这两个集合的属性。没有 NHibernate 诡计,它为将来的微调留出了足够的空间。
      猜你喜欢
      • 2016-08-06
      • 2021-04-27
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多