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

EF中调用Category的TopCategory属性出现空引用异常求助

解决EF中导航属性TopCategory触发NullReferenceException的问题

你遇到的空引用异常,核心原因是EF的延迟加载未生效:

  • 你在Controller里手动关闭了代理创建(context.Configuration.ProxyCreationEnabled = false),而EF的延迟加载依赖动态生成的代理类,此时就算给TopCategory加virtual,延迟加载也无法触发,导致TopCategory始终为null
  • 直接访问null对象的CategoryName属性,必然抛出System.NullReferenceException

解决方案1:启用延迟加载(推荐)

恢复代理创建,同时确保导航属性为virtual:

  1. 修改模型Category.cs,给导航属性添加virtual关键字:
public class Category
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CategoryID { get; set; }
    [Column(TypeName = "Varchar")]
    [StringLength(25)]
    public string CategoryName { get; set; }
    
    // 加virtual启用延迟加载
    public virtual Category TopCategory { get; set; }
}
  1. 修改Controller,删除关闭代理的代码:
Context context = new Context();
    
public ActionResult Index()
{
    // 移除这行:context.Configuration.ProxyCreationEnabled = false;
    var categories = context.Categories.ToList();
    return View(categories);
}

解决方案2:显式加载导航属性(适合禁用延迟加载的场景)

如果必须关闭代理创建,就用Include方法主动加载TopCategory:

// 需先引用 using System.Data.Entity;
Context context = new Context();
    
public ActionResult Index()
{
    context.Configuration.ProxyCreationEnabled = false;
    // 用Include显式加载关联的TopCategory
    var categories = context.Categories.Include(c => c.TopCategory).ToList();
    return View(categories);
}

解决方案3:视图层做空值保护(临时应急)

若不想修改后端代码,可在视图里判断TopCategory是否为null,避免崩溃:

@using WTvP_E_Ticaret_Projesi.Models.Classes
@model List<Category>

@foreach (var category in Model)
{
    ... (other stuffs)
            @(category.TopCategory != null ? category.TopCategory.CategoryName : "无上级分类")
    ... (other stuffs)
 }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:50:09