NHibernate fetch创建正确的查询,然后执行N+1

本文关键字:然后 执行 N+1 查询 fetch 创建 NHibernate | 更新日期: 2023-09-27 18:02:29

我有三个实体,配置为

Contact
  HasOne(e => e.User).PropertyRef(e => e.Contact).Cascade.All();
User
  HasMany(e => e.Requests);
  References(e => e.Contact);
Request
  References(e => e.User);

然后我做这样的查询:

  CurrentSession.Query<Request>()
                .Fetch(x => x.User)
                .ThenFetch(x => x.Contact)
                .ToList();

它看起来像Fetch工作,因为在第一次选择我看到所有的表连接(省略其他字段为简洁):

SELECT request0_.Id                 as Id128_0_,
   user1_.Id                       as Id131_1_,
   contact2_.Id                    as Id77_2_,
FROM   requests request0_
   left outer join users user1_
     on request0_.user_id = user1_.Id
   left outer join contacts contact2_
     on user1_.contact_id = contact2_.Id

然后跟随N+1选择,由于某种原因,我不能理解,也不知道如何解决这个问题:

SELECT user0_.Id                as Id131_0_,
FROM   users user0_
WHERE  user0_.contact_id = 200 /* @p0 - contact_id */

NHibernate fetch创建正确的查询,然后执行N+1

目前是NHibernate的一个bug。