【问题标题】:Fluent Nhibernate loading not falling back on lazy loading? (grandchild entities)流畅的 Nhibernate 加载不会依赖延迟加载? (孙实体)
【发布时间】:2015-12-08 02:42:59
【问题描述】:

在查询 nhibernate 时,我看到了一些奇怪的行为

当我写这样的查询时

Repository.QueryOver<Entity>()
    .Fetch(x => x.Child1).Eager
    .Fetch(x => x.child2).Eager

它会急切地抓取 child1 和 child2 实体,但是 child1 和 child2 的孙子不会延迟加载。我对如何实现这一点有点困惑。

在我的 nhibernate 映射中,它似乎对孙子的懒惰或急切没有影响,我需要至少急切加载一些实体以避免 N+1 查询问题。

我也想知道如何在我的原始实体下急切地加载孙子实体。

感谢任何帮助或想法!

【问题讨论】:

  • 要走的路是batch fetching,这里是fluent
  • 我需要在映射的哪个级别声明批处理?那么是否需要在查询 API 中做任何事情来确保它使用批次?抱歉,Nhibernate 可能在文档中对此并不清楚
  • 我把所有的信息都放到了答案中。希望对您有所帮助

标签: nhibernate fluent-nhibernate lazy-loading eager-loading fluent-nhibernate-mapping


【解决方案1】:

我建议使用batch-fetching。正如here 所讨论的,流畅的语法是:

1) 集合设置

HasMany<MyEntity>(x => x.Entities)
  .BatchSize(100);

2)class级别设置

public MyEntityMap()
{
    Id(x => x....
    ...
    BatchSize(100);

此设置应应用于每个集合和每个类。要使用流利的方式做到这一点 - 我们可以使用 Conventions - 查看更多例如here

'IClassConvention' - 用于更改您的 ClassMaps 值。您不能使用此约定更改属性、集合等,只能更改 LazyBatchSize 等设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多