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)依赖于批处理大小和页面大小。