为什么FetchKind不能使用Mapping.ByCode在NHibernate中工作

沉舟侧畔千帆进,病树前头万木春。这篇文章主要讲述为什么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

【为什么FetchKind不能使用Mapping.ByCode在NHibernate中工作】请注意,这不是一个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/

    推荐阅读