dotnet data_error ai_generated true

System.InvalidOperationException: A navigation property 'NavigationName' is null. Related data must be loaded using Include or other eager loading methods.

ID: dotnet/ef-core-navigation-property-null-after-include

Also available as: JSON · Markdown · 中文
90%Fix Rate
85%Confidence
1Evidence
2023-03-15First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
6.0 active
7.0 active
8.0 active
9.0 active

Root Cause

Entity Framework Core navigation property is null because related data was not eagerly loaded with .Include() or .ThenInclude() before accessing it after a query.

generic

中文

Entity Framework Core 导航属性为 null,因为在查询后未使用 .Include() 或 .ThenInclude() 预先加载相关数据。

Official Documentation

https://learn.microsoft.com/en-us/ef/core/querying/related-data/eager

Workarounds

  1. 95% success Add .Include() with .ThenInclude() for nested navigation properties. Example: var orders = context.Orders.Include(o => o.Customer).ThenInclude(c => c.Address).ToList();
    Add .Include() with .ThenInclude() for nested navigation properties. Example: var orders = context.Orders.Include(o => o.Customer).ThenInclude(c => c.Address).ToList();
  2. 85% success Use explicit loading with .Collection().Load() or .Reference().Load() after the query. Example: var order = context.Orders.First(); context.Entry(order).Collection(o => o.OrderItems).Load();
    Use explicit loading with .Collection().Load() or .Reference().Load() after the query. Example: var order = context.Orders.First(); context.Entry(order).Collection(o => o.OrderItems).Load();
  3. 90% success Enable lazy loading by installing Microsoft.EntityFrameworkCore.Proxies and configuring: optionsBuilder.UseLazyLoadingProxies(); then ensure navigation properties are virtual.
    Enable lazy loading by installing Microsoft.EntityFrameworkCore.Proxies and configuring: optionsBuilder.UseLazyLoadingProxies(); then ensure navigation properties are virtual.

中文步骤

  1. 添加 .Include() 和 .ThenInclude() 以加载嵌套导航属性。示例:var orders = context.Orders.Include(o => o.Customer).ThenInclude(c => c.Address).ToList();
  2. 查询后使用 .Collection().Load() 或 .Reference().Load() 进行显式加载。示例:var order = context.Orders.First(); context.Entry(order).Collection(o => o.OrderItems).Load();
  3. 通过安装 Microsoft.EntityFrameworkCore.Proxies 并配置启用延迟加载:optionsBuilder.UseLazyLoadingProxies(); 确保导航属性为 virtual。

Dead Ends

Common approaches that don't work:

  1. Adding .Include() to the query but missing .ThenInclude() for nested navigation properties 75% fail

    EF Core requires explicit .ThenInclude() for second-level navigation properties; only Include() loads the immediate property but not its children.

  2. Using .Load() after the query without calling .Collection() or .Reference() correctly 60% fail

    Explicit loading with .Load() requires specifying the navigation property via .Collection() or .Reference() first; incorrect syntax leads to same null error.

  3. Setting LazyLoadingEnabled = true in DbContext but not installing the Microsoft.EntityFrameworkCore.Proxies package 80% fail

    Lazy loading requires both configuration and the Proxies NuGet package; missing the package causes no automatic loading and null navigation properties.