缓存构建的连接太多

时间:2014-01-16 13:13:56

标签: c# nhibernate caching fluent-nhibernate

考虑以下用于构建授权信息缓存的方法。当您拥有上下文用户时,缓存将能够告诉您对哪些公司等的权利。

    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或其他任何方式自己做。我现在非常愿意接受任何建议。

0 个答案:

没有答案