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懒加载代理:- 通过NuGet安装包
Microsoft.EntityFrameworkCore.Proxies - 在Program.cs配置DbContext的代码中启用懒加载:
builder.Services.AddDbContext<你的应用DbContext类>(options => options.UseLazyLoadingProxies() // 启用懒加载代理 .UseSqlServer(builder.Configuration.GetConnectionString("你的连接字符串名")) );
- 通过NuGet安装包
- 方案3:视图层加空值兜底
不管使用上述哪种数据加载方案,都建议在视图渲染分类名时加空判断,避免个别脏数据导致整页崩溃,修改视图中问题行代码:<td class="text-center">@obj.Category?.Name ?? "未分类"</td>
以上代码中
?.是C#的空条件运算符,当Category为null时不会访问Name属性,直接返回null;??是空合并运算符,null时显示兜底文本“未分类”。
内容的提问来源于stack exchange,提问作者abisammy
相关产品推荐
相关产品推荐

