为什么FetchKind不能使用Mapping.ByCode在NHibernate中工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么FetchKind不能使用Mapping.ByCode在NHibernate中工作相关的知识,希望对你有一定的参考价值。
我相信这个问题是由忽略FetchKind属性引起的。
我有一张员工表:
Employee
{
ID
Name
PositionCode
}
和一个位置表:
Position
{
Code
Description
}
我使用Mapping.ByCode加入了这些表并将Fetch设置为Join,但它似乎不起作用。
我查看了十几个堆栈溢出帖子,询问相同的问题,但似乎无法得到明确的答案。
public class EmployeeMapper: ClassMapping<Employee>
{
public EmployeeMapper()
{
Lazy(false);
Table("EMPLOYEE");
Id(x => x.Id, m => m.Column("ID");
MapToOne(c => c.PositionCode, posMap =>
{
posMap.Lazy(LazyRelation.NoLazy);
posMap.Fetch(FetchKind.Join)
posMap.Column("CODE");
}
}
}
我使用了NHibernate探查器,其行为如下:
Select all employees
foreach employee
select position
请注意,这不是一个sql select,如果有1000个员工,则会扩展为1001个select语句(一个用于所有员工,然后是每个位置一个)。
如果有人可以提供帮助,将不胜感激。
答案
一般的NHibernate方式如何避免1 + N问题是使用BatchSize()
设置。这种方式应该比在映射中使用JOIN Fetching更合适(让我们用它来查询)
有两个:
- 实体层面
- 收集水平
请参阅Adam Bar的Mapping-by-Code - entity-level mappings,我们可以看到代码支持的映射:
BatchSize(25)
通常,NHibernate将使用IN子句一次加载更多的集合(列表,映射),并使用更多的parentIds。这将导致cca 1+(N / 25)......我认为这是合理的。
直到我们不需要收集......它被懒散地加载。如果我们需要,它的所有部件都是分批装载的。
有一些类似的链接,与BatchSize
设置和1 + N问题有关:
- NHibernate QueryOver with Fetch resulting multiple sql queries and db hits
- Is this the right way to eager load child collections in NHibernate
- https://stackoverflow.com/questions/18419988/
以上是关于为什么FetchKind不能使用Mapping.ByCode在NHibernate中工作的主要内容,如果未能解决你的问题,请参考以下文章