我在Person和Widget之间的数据库中有一个标准的多对多关系。具有管理角色的人员可以访问所有窗口小部件。在我的应用程序中,我想查看一个Person可以访问哪些Widgets。
我有两个高级选项:
明确管理关系。当Person成为管理员时,将该Person与所有现有Widgets相关联。创建窗口小部件时,将该窗口小部件与所有现有管理员关联。
在运行时,如果Person是管理员,则假设他们可以访问所有小部件并在加载小部件时绕过关系表。
一种选择比另一种更好吗?这个场景有名称吗?
我一直在尝试使用NHibernate来应用选项2,我似乎无法弄清楚如何在为实体加载所有Widgets时绕过关系表(即使我可以,这会不必要地加载很多除非我从Person实体中单独加载Widgets并应用分页,否则将显示信息。
答案 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是管理员,它会根据视图中的关系加载所有窗口小部件,否则它会根据连接表加载窗口小部件。