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