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

问题描述 投票:3回答:1

我相信这个问题是由忽略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 mapping lazy-loading fetch mapping-by-code
1个回答
2
投票

一般的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问题有关:

© www.soinside.com 2019 - 2024. All rights reserved.