ASP.NET MVC运行时抛NullReferenceException 加断点后异常不触发问题
问题描述
ASP.NET MVC程序仅在正常运行时抛出NullReferenceException,添加断点后异常不会触发,即便按下F10快速单步跳过也不会抛出。
触发异常的代码如下(错误位置见注释):
public static double GetTotalExpenses(Sandooq sandooq, string userID = "") { double totalExpenses = 0; if (sandooq.expenses == null || sandooq.expenses.Count == 0 || (!string.IsNullOrEmpty(userID) && sandooq.expenses.Where(i => i.member.Id.Equals(userID)).Count() == 0)) { return totalExpenses; } if (!string.IsNullOrEmpty(userID)) { foreach (Expense e in sandooq.expenses.Where(e => e.member.Id.Equals(userID) && !e.category.mainCategoryType.Equals("DPE"))) { totalExpenses += e.amount; } } else { // 错误发生在此处,e.category为null foreach (Expense e in sandooq.expenses.Where(e=> !e.category.mainCategoryType.Equals("DPE"))) { totalExpenses += e.amount; } } return totalExpenses; }
仅当未设置断点时,expense的category属性才会为null。
原因分析
该问题由Entity Framework懒加载的触发时机差异导致:
- 无断点直接运行时,执行到访问
e.category的代码行时,对应的DbContext已经被释放,懒加载无法拉取关联的category数据,直接返回null,触发空引用异常 - 加断点调试时,断点停留的间隙调试器会隐式触发属性加载,或者此时DbContext还未被释放,懒加载可以正常拿到category数据,因此不会触发异常
解决方案
从数据库加载expenses列表时,显式预加载关联实体category,不依赖运行时懒加载,对应修改的加载代码如下:
sandooq.expenses = dbContext.dbExpenses.Include("category").Where(e => e.sandooq.id == sandooq.id).ToList();
内容的提问来源于stack exchange,提问作者AhmadAGH
相关产品推荐
相关产品推荐

