考虑以下用于构建授权信息缓存的方法。当您拥有上下文用户时,缓存将能够告诉您对哪些公司等的权利。
internal List<UserGroupInfo> BuildUserGroupCache()
{
// NB! If you remove the ToArray() a lot of duplicate infos will be generated!
return Session.Query<UserGroup>()
.FetchMany(ug => ug.FunctionGroups).ThenFetchMany(fg => fg.Functions)
.FetchMany(ug => ug.Companies).ToArray().Select(ug => new UserGroupInfo(ug)).ToList();
}
现在,问题在于它生成了带有六个连接的sql。这是我的from子句。 (你不需要知道我的领域是什么。)
[UserGroup] usergroup0_
left outer join FunctionGroupsToUserGroups functiongr1_
on usergroup0_.Id = functiongr1_.UserGroup_id
left outer join [FunctionGroup] functiongr2_
on functiongr1_.FunctionGroup_id = functiongr2_.Id
left outer join FunctionsToFunctionGroups functions3_
on functiongr2_.Id = functions3_.FunctionGroup_id
left outer join [Function] function4_
on functions3_.Function_id = function4_.Id
left outer join UserGroupsToCompanies companies5_
on usergroup0_.Id = companies5_.UserGroup_id
left outer join [Company] company6_
on companies5_.Company_id = company6_.Id
为什么这是一个问题?因为当我拥有这些实体中的每一个时,结果集将很快变得非常大并且将包含许多不必要的重复数据。冬眠犀牛在too many joins的问题上有这个说法。
这些的自动覆盖是这样的:
//UserGroup
mapping.HasManyToMany(x => x.Companies)
.FetchType.Select()
.ExtraLazyLoad();
mapping.HasManyToMany(x => x.FunctionGroups)
.FetchType.Select();
//FunctionGroup
mapping.HasManyToMany(x => x.Functions)
.FetchType.Select();
如何更改此设置以便我无法获得所有这些连接?我想要实现的是每个实体类型的完整选择; UserGroup,FunctionGroup和Function,并让NHibernate基于关系表建立关系; FunctionGroupToUserGroups等
我应该如何去做,或者通过使用HQL或其他任何方式自己做。我现在非常愿意接受任何建议。