.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
相关产品推荐
相关产品推荐

