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

ASP.NET Core MVC访问Category.Name报NullReferenceException错误

错误产生原因

你的判断完全准确,这个空引用异常的核心原因是关联的Category导航属性数据没有被加载,具体触发逻辑:

  • 控制器查询Book列表时,仅从Books表取数据,没有主动加载关联的分类数据。
  • 你虽然给Book类的Category属性加了virtual修饰,但EF Core默认不启用懒加载功能,必须额外安装依赖包、手动配置后才会自动查询关联数据,因此遍历Book集合时,obj.Category值为null,访问.Name属性时就会抛出空引用异常。
  • 还有一种边缘触发场景:数据库中部分Book记录对应的CategoryId关联的分类数据已被删除,即使正常加载关联数据,这部分脏数据对应的Category属性仍为null,也会触发异常。
修复方案

你可以根据场景选择以下方案,建议组合使用避免后续异常:

  • 方案1(推荐,性能最优):查询时使用预加载加载关联数据
    修改Book控制器的List Action,通过Include()方法在查询Book列表时同步拉取关联的Category数据,不需要额外安装依赖:
    // 首先引入EF Core的命名空间
    using Microsoft.EntityFrameworkCore;
    
    //GET
    public IActionResult List()
    {
        IEnumerable<Book> objBookList = _db.Books
            .Include(b => b.Category) // 预加载关联分类数据
            .OrderBy(t => t.Name)
            .ToList();
        return View(objBookList);
    }
    
  • 方案2:启用懒加载自动加载关联数据
    如果希望访问导航属性时自动查询关联数据,可以配置EF Core懒加载代理:
    1. 通过NuGet安装包Microsoft.EntityFrameworkCore.Proxies
    2. 在Program.cs配置DbContext的代码中启用懒加载:
      builder.Services.AddDbContext<你的应用DbContext类>(options =>
          options.UseLazyLoadingProxies() // 启用懒加载代理
          .UseSqlServer(builder.Configuration.GetConnectionString("你的连接字符串名"))
      );
      
    注意:列表场景使用懒加载会产生N+1查询问题,数据量较大时性能明显下降,不推荐在列表页使用。
  • 方案3:视图层加空值兜底
    不管使用上述哪种数据加载方案,都建议在视图渲染分类名时加空判断,避免个别脏数据导致整页崩溃,修改视图中问题行代码:
    <td class="text-center">@obj.Category?.Name ?? "未分类"</td>
    

以上代码中?.是C#的空条件运算符,当Category为null时不会访问Name属性,直接返回null;??是空合并运算符,null时显示兜底文本“未分类”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:36:24