双向多对一生成SELECT N+1
本文关键字:SELECT N+1 一生 | 更新日期: 2023-09-27 17:54:49
我有两个类映射与NHibernate:类应用程序引用类Store与属性StoreId。应用程序用户有一个身份id,而类Store有一个分配的id,但我认为在这种情况下,这无关紧要。
ApplicationUser映射:
<many-to-one name="Store" column="StoreId" class="Store" />
存储映射:
<many-to-one name="ApplicationUser" column="Id" class="ApplicationUser"
property-ref="Store" insert="false" update="false"
fetch="join" outer-join="true" />
当我加载所有商店时,左外连接按预期生成ApplicationUser,但是当构建对象图时,NHibernate决定为每个不引用ApplicationUser的商店做一个额外的SELECT ... FROM ApplicationUser WHERE StoreId = ?
。
这是过度的,完全没有必要的,因为它应该已经知道那些ApplicationUsers不存在。
谁知道如何阻止NHibernate生成这些额外的查询?
编辑:类非常基本,像这样:
public class Store
{
public virtual int Id { get; set; }
// ...
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class ApplicationUser
{
public virtual int Id { get; set; }
// ...
public virtual Store Store { get; set; }
}
我认为这里发生的事情是nHibernate正在尝试加载两个集合,因为你已经将每个指定为'多对一'…我认为除了修改映射之外,你什么都做不了。
所以a -> xb和b -> xa,我的理解是,nHibernate将查询两个关系…对我来说很有意义。
如果不需要集合,则不能在查询中包含它并依赖延迟加载。