许多人与隐含和明确的关系

时间:2011-07-21 21:56:12

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

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

我有两个高级选项:

  1. 明确管理关系。当Person成为管理员时,将该Person与所有现有Widgets相关联。创建窗口小部件时,将该窗口小部件与所有现有管理员关联。

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

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

    我一直在尝试使用NHibernate来应用选项2,我似乎无法弄清楚如何在为实体加载所有Widgets时绕过关系表(即使我可以,这会不必要地加载很多除非我从Person实体中单独加载Widgets并应用分页,否则将显示信息。

2 个答案:

答案 0 :(得分:1)

我会通过角色来映射它。

角色:人= 1:很多

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

然后问题很简单:你需要一个WidgetRole表。

创建新的Widget时,条目会自动添加到NewWidget的WidgetRole表中,AdminRole

当Person更改为Admin Role时,只需更改其当前角色。

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

答案 1 :(得分:0)

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

我已经创建了人员的子类,NHibernate足够智能识别管理员:人员并将该人员实例化为管理员(其中管理员拥有带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是管理员,它会根据视图中的关系加载所有窗口小部件,否则它会根据连接表加载窗口小部件。