NHibernate QueryOver与Fetch导致多个SQL查询和数据库命中

我正在尝试选择一个实体并获取相关列表:


    Session.QueryOver<UserRole>()

           .Fetch(x => x.UsersInRole).Eager

           .List();

这导致很多数据库命中。第一个是这样的:


 SELECT ... FROM UserRoles

 left outer join UsersInRoles on ...

还有数百个单独的查询,如下所示:


 SELECT ... FROM UsersInRoles

 left outer join UserRoles on ...

 WHERE UserRoles.UserId=?

映射如下:


public class UserRoleMap : ClassMap<UserRole>

{

    public UserRoleMap()

    {

        Id(x => x.Id);

        Map(x => x.RoleName);

        HasManyToMany(x => x.UsersInRole)

        .Inverse()

        .LazyLoad()

        .Table("UsersInRoles");

    }

}


撒科打诨
浏览 542回答 3
3回答

RISEBY

我会说,这是我们应该期待的行为。让我们来一个场景,在系统中我们有2个用户和2个角色User1 - Role1 // has only Role1User2 - Role1 // now we see that Role2 has more then User1User2 - Role2假设第一个查询将仅检索User1及其多对多关系Role1。我们必须在ISession此刻只有用户1,所以设置用户的role1上是不完整的 (我们不能重用的对象装入的Isession的时刻)。但是人们怎么知道我们在哪里呢?Role1是否为会话加载了所有数据?Role1必须发出新查询,并为其加载数据。这样,我们最终可以得到这些查询的信息。我认为最好的解决方案(几乎在所有情况下都在使用它)是batch-size设置:19.1.5。使用批量提取HasManyToMany(x => x.UsersInRole)&nbsp; ...&nbsp; .BatchSize(25)标记您所有的收藏地图.BatchSize(25),甚至对Class地图也这样做。这将导致多于1个SQL脚本,但最后取决于批处理大小和页面大小,最多不会超过1 +(2-4)。

回首忆惘然

尝试了您的建议。结果是1 + 12个查询-比以前要好很多,但是不是有办法使它少于12个吗?(增加批量大小?)-批量大小的成本是多少?我会怀疑,如果一切都很好,它将默认设置为。批量大小是唯一的解决方案吗?是否存在可能导致2个查询的联接?如果我需要用简单的SQL编写自己的代码,我认为2条查询就足够了。谢谢。
打开App,查看更多内容
随时随地看视频慕课网APP