我正在尝试选择一个实体并获取相关列表:
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");
}
}
答案 0 :(得分:3)
我想说,这种行为是我们应该期待的。让我们有一个场景,我们在系统中有2个用户和2个角色
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
的数据。这样,我们最终可以对这些查询进行处理......
我认为最佳解决方案(我几乎在所有情况下都使用它)是batch-size
设置:19.1.5. Using batch fetching
HasManyToMany(x => x.UsersInRole)
...
.BatchSize(25)
使用.BatchSize(25)
标记所有收藏地图,即使对于地图也是如此。这将导致超过1个SQL脚本,但最后不多于1 +(2-4),具体取决于批量大小和页面大小。