EF中调用Category的TopCategory属性出现空引用异常求助
解决EF中导航属性TopCategory触发NullReferenceException的问题
你遇到的空引用异常,核心原因是EF的延迟加载未生效:
- 你在Controller里手动关闭了代理创建(
context.Configuration.ProxyCreationEnabled = false),而EF的延迟加载依赖动态生成的代理类,此时就算给TopCategory加virtual,延迟加载也无法触发,导致TopCategory始终为null - 直接访问
null对象的CategoryName属性,必然抛出System.NullReferenceException
解决方案1:启用延迟加载(推荐)
恢复代理创建,同时确保导航属性为virtual:
- 修改模型
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; } }
- 修改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
相关产品推荐
相关产品推荐

