如何使用nHibernate Fluent映射映射HasOne关系并避免N+1



我有两个表ATableAATable,这两个表都有一个共享的主键-ATable.aKeyAATable.aKey来表示一对一的关系。对于我的Fluent映射,我在Fluent ATableMapping中定义了HasOne关系,所有这些都很好。但是,我注意到查询ATable会为子表AATable生成第二个查询(N+1)。我的理解是,默认情况下Hasone急切地加载,我曾认为这将是ATable查询的一部分,但我很可能错了?

我研究了各种解决方案,包括使用.Not.LazyLoad().Fetch.Join()、PropertyRef、ForeignKey,但我似乎无法解析n+1,因此它要么是Eager加载了1个查询,要么是Lazy加载了,我可以用我的查询获取子项。

有人对此有任何问题吗?或者有一个他们知道在没有n+1的情况下工作的例子吗?感谢您的建议。

您有两个选项:

  1. Not.LazyLoad(),它禁用了提供延迟加载的相关实体的可能性,并且它将强制NHB在原始查询中提供相应的subselect
  2. 使用component mapping使两个实体指向同一个表。这是一种更好的方法,因为一旦您决定将两个实体放在一起,生成的查询只会命中一个表,而不是像第一个选项中那样命中两个表。这对性能肯定更好

最新更新