实体框架核心2.1错误地延迟加载了某些导航属性,但没有加载其他导航属性

时间:2018-10-03 19:58:39

标签: .net-core entity-framework-core lazy-loading eager-loading

我正在尝试通过确保仅渴望加载模型来解决Entity Framework Core 2.1项目的n + 1问题。

我遇到的问题是某些相关模型正在被延迟加载,而其他模型则没有。需要明确的是,我根本不需要延迟加载任何东西,也没有明确启用它。我不认为这是预期的行为。

例如,当我运行以下代码时,它将按预期返回所有包含的数据。

List<User> users = _context.Users
    .Include(u => u.Engine)
    .Include(u => u.ClientType)
    .Include(u => u.Organization)
    .Include(u => u.Role)
    .ToList();

但是,如果我删除所有包含,则列表中约90%的用户仍将包含其关联数据。我相信这就是为什么尽管使用了急切加载但还是遇到n + 1问题的原因。

为什么只有某些相关模型是延迟加载的?如果我没有启用任何东西,为什么它们会被延迟加载?尽管我仅尝试使用紧急加载,但这可能是我的n + 1问题的根本原因吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,EF Core不启用延迟加载。您必须明确选择加入它,然后将导航属性标记为virtual。如果您不想延迟加载,请确保您的OnConfiguring方法不会调用UseLazyLoadingProxies()

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
    // .UseLazyLoadingProxies() <- Only use this to enable lazy loading.
    .UseSqlServer(myConnectionString);