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

我试图select一个实体并获取相关列表:

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"); } } 

我会说,这种行为是我们应该期待的。 让我们有一个场景,我们在系统中有2个用户和2个angular色

 User1 - Role1 // has only Role1 User2 - Role1 // now we see that Role2 has more then User1 User2 - Role2 

假设第一个查询将仅检索User1及其多对多关系Role1 。 我们目前在ISession中只有User1 ,所以Role1的用户组是不完整的 (我们不能重复使用加载到ISession中的对象) 。 但是,怎么知道我们在哪里? 为Role1加载的所有数据是否在会话中?

新的查询,加载数据为Role1必须发布。 这样,我们可以在最后有这些查询dosens …

我认为最好的解决scheme(我几乎在所有情况下都使用它)是batch-size设置: 19.1.5。 使用批量获取

 HasManyToMany(x => x.UsersInRole) ... .BatchSize(25) 

.BatchSize(25)标记所有的collections地图,甚至在Class地图上也要这样做。 这将导致更多的1个SQL脚本,但最终不会超过1 +(2-4)依赖于批处理大小和页面大小。