【问题标题】:Entity Framework Core 3.1 Load() Async Explicit LoadingEntity Framework Core 3.1 Load() 异步显式加载
【发布时间】:2020-12-01 10:16:34
【问题描述】:

我的代码中有很多 EF 显式调用,它们会在之后加载数据以避免 EF 笛卡尔积(因为它会减慢我的查询速度)

var users = await dbContext.User.ToListAsync();
foreach (var user in users )
{
   await dbContext.Entry(user).Reference(b => b.VirtualProperty1).LoadAsync();
   await dbContext.Entry(user).Reference(b => b.VirtualProperty2).LoadAsync();
   await dbContext.Entry(user).Collection(b => b.VirtualCollection).LoadAsync();
}

问题是,我可以放弃await 并做await Task.WhenAll(AllAboveEagerLoadTasks) 吗?

【问题讨论】:

  • 您认为急切加载 (Include) 与笛卡尔积相同的假设是不正确的。如果 Include 很慢,您可以尝试在 EF 5 中使用 split queries
  • 我知道,但不幸的是,我正在使用尚未为 EF5 做好准备的 Azure Functions。
  • 我担心我会得到跟踪异常
  • 什么是跟踪异常?使用IncludeLoad 将跟踪实体。至于WhenAll,上下文不是线程安全的。

标签: c# eager-loading entity-framework-core-3.1


【解决方案1】:

正如 Gert 在评论中提到的并且我已经测试过自己,上下文不是线程安全的,所以不幸的是不能并行加载实体。 EF5 确实为 SplitQueries 提供了解决方案。

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2020-06-07
    • 2023-03-29
    • 2020-05-28
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多