为什么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问题有关:

以上是关于为什么FetchKind不能使用Mapping.ByCode在NHibernate中工作的主要内容,如果未能解决你的问题,请参考以下文章

为什么Typescript不能使用包含函数的数组?

为啥VSCO不能用

为啥我不能使用“List”作为 UITableViewController 子类的类名?

为啥内核代码不能使用红区

为啥路由器桥接成功不能上网

为啥我不能对这个图像使用 getimagesize PHP? [复制]