You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 2中WorkoutExercises的Exercises属性为空问题咨询

问题解析与解决方案

嘿,这个问题我之前在.NET Core 2.x项目里也踩过坑!咱们一步步说清楚:

为什么Exercises属性是null?

在EF Core 2.x中,延迟加载(Lazy Loading)是默认关闭的——这和老版本的EF6不一样,EF6默认是开启延迟加载的。所以当你直接查询WorkoutExercises的时候,EF不会自动帮你加载它关联的Exercises数据,除非你明确告诉它要这么做。如果没做任何额外配置,那关联属性自然就是null了。

要不要手动包含?当然要!(或者换另一种加载方式)

有两种常见的解决办法,你可以根据自己的场景选:

1. 显式使用Include()进行急加载(最推荐的场景:你确定要一次性拿到关联数据)

这是最直接的方式,在LINQ查询里用Include()方法指定要加载的关联属性,EF会生成JOIN语句一次性把WorkoutExercises和Exercises的数据都查回来:

var workoutExercises = _dbContext.WorkoutExercises
    .Include(we => we.Exercises) // 显式包含关联的Exercises
    .FirstOrDefault(we => we.Id == someId);

如果还有多层关联(比如Exercises还有子属性),可以用ThenInclude()继续嵌套加载。

2. 启用延迟加载(适合需要按需加载关联数据的场景)

如果你希望在后续代码中访问Exercises时才自动去数据库查询,那可以启用延迟加载,但需要做两步配置:

  • 首先安装NuGet包:Microsoft.EntityFrameworkCore.Proxies
  • 然后在你的DbContext的OnConfiguring方法里开启延迟加载代理:
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("你的连接字符串")
                      .UseLazyLoadingProxies(); // 启用延迟加载代理
    }
    
  • 最后把WorkoutExercises里的Exercises属性改成virtual:
    public class WorkoutExercises
    {
        // 其他属性...
        public virtual Exercise Exercises { get; set; } // 加virtual关键字
    }
    

这样当你第一次访问workoutExercise.Exercises时,EF会自动触发查询加载数据(注意:此时DbContext必须还处于活跃状态,不能已经被Dispose)。

额外提醒

如果是一对一的关联关系,还要确保你的实体配置是正确的——比如用Fluent API配置HasOne<Exercise>().WithOne(),避免EF无法识别关联关系导致加载失败。

内容的提问来源于stack exchange,提问作者eddyuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:50:40