gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:50:50 24 4
gpt4 key购买 nike

我相信这个问题是由忽略 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 语句(所有员工一个,每个职位一个)。

如果有人可以提供帮助,将不胜感激。

最佳答案

如何避免 1 + N 问题的一般 NHibernate 方法是使用 BatchSize()环境。这种方式应该比在映射中使用 JOIN Fetching 更合适(让我们用它来查询)

其中有两个:

  • 实体级
  • 收藏级

  • Mapping-by-Code - entity-level mappings ,由 Adam Bar,我们可以在其中看到代码支持的映射:
    BatchSize(25)

    通常,NHibernate 将使用 IN 子句一次加载更多集合(列表、 map ),并带有更多 parentId。这将导致 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/
  • 关于nhibernate - 为什么 FetchKind 不能使用 Mapping.ByCode 在 NHibernate 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22951603/

    24 4 0
    文章推荐: javascript - 扫描嵌套对象的数组以查找匹配项
    文章推荐: jquery - 如何将 Jquery
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com