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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:07:34