双向多对一生成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; }
}

双向多对一生成SELECT N+1

我认为这里发生的事情是nHibernate正在尝试加载两个集合,因为你已经将每个指定为'多对一'…我认为除了修改映射之外,你什么都做不了。

所以a -> xb和b -> xa,我的理解是,nHibernate将查询两个关系…对我来说很有意义。

如果不需要集合,则不能在查询中包含它并依赖延迟加载。