.NET中实体类Lazy Loading失效问题排查
延迟加载失效的原因及解决方法
你的延迟加载失效核心原因是EF Core默认不启用延迟加载,再加上缺少必要的依赖包与配置,即便给导航属性标记了virtual,也无法自动加载关联的Categoria实体。以下是具体分析和解决步骤:
1. 缺少延迟加载依赖包
EF Core的代理式延迟加载需要依赖Microsoft.EntityFrameworkCore.Proxies包,先安装该包:
# NuGet包管理器控制台命令 Install-Package Microsoft.EntityFrameworkCore.Proxies # 或.NET CLI命令 dotnet add package Microsoft.EntityFrameworkCore.Proxies
2. 未在DbContext中启用延迟加载
安装包后,需在DbContext配置中开启延迟加载代理,有两种配置方式:
方式一:在DbContext的OnConfiguring方法中配置
public class SistemaJustificativasContext : DbContext { // ...其他上下文代码 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseLazyLoadingProxies() // 启用延迟加载代理 .UseSqlServer("你的数据库连接字符串"); } }
方式二:在服务注册时配置(Program.cs/Startup.cs)
// Program.cs示例代码 builder.Services.AddDbContext<SistemaJustificativasContext>(options => { options.UseLazyLoadingProxies() // 启用延迟加载代理 .UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); });
3. 额外验证点
- 导航属性必须标记为
virtual:你的代码中public virtual Categoria Categoria { get; set; }已经满足要求,无需修改。 - 实体类不能是
sealed(密封类):你的Pergunta和Categoria都是普通类,符合延迟加载的实体要求。 - 上下文生命周期:确保访问延迟加载属性时,DbContext实例未被释放。你的Controller中
_context是Scoped注入的,在Index方法执行期间上下文处于活跃状态,满足条件。
替代方案:立即加载(Include)
如果不需要延迟加载,也可以直接用Include主动加载关联实体,无需配置延迟加载,修改查询代码即可:
List<Pergunta> teste = await _context.Pergunta.Include(p => p.Categoria).ToListAsync();
内容的提问来源于stack exchange,提问作者Saulo Torres
相关产品推荐
相关产品推荐

