我有两个表ATable和AATable,这两个表都有一个共享的主键-ATable.aKey和AATable.aKey来表示一对一的关系。对于我的Fluent映射,我在Fluent ATableMapping中定义了HasOne关系,所有这些都很好。但是,我注意到查询ATable会为子表AATable生成第二个查询(N+1)。我的理解是,默认情况下Hasone急切地加载,我曾认为这将是ATable查询的一部分,但我很可能错了?
我研究了各种解决方案,包括使用.Not.LazyLoad().Fetch.Join()、PropertyRef、ForeignKey,但我似乎无法解析n+1,因此它要么是Eager加载了1个查询,要么是Lazy加载了,我可以用我的查询获取子项。
有人对此有任何问题吗?或者有一个他们知道在没有n+1的情况下工作的例子吗?感谢您的建议。
您有两个选项:
Not.LazyLoad()
,它禁用了提供延迟加载的相关实体的可能性,并且它将强制NHB在原始查询中提供相应的subselect
- 使用
component mapping
使两个实体指向同一个表。这是一种更好的方法,因为一旦您决定将两个实体放在一起,生成的查询只会命中一个表,而不是像第一个选项中那样命中两个表。这对性能肯定更好