Entity Framework数据模型创建遇空引用错误,求排查方案
空引用错误排查求助:Entity Framework + ASP.NET Web API
我按照指定JSON格式创建了Controller,也编写了对应的数据模型,但运行时抛出Object reference is not set to an instance of an object空引用异常。本人对Entity Framework框架不熟悉,无法定位问题,附上相关代码及JSON示例,请帮忙排查。
JSON请求示例
{ "MacAddress": "30:a3:d5:a6:e4:b3", "TotalNodes": 1, "Report": [{ "Status": [{ "ID": 3, "Val": 0, "RSSI": { "Hop1": -80, "Hop2": -10 }, "Route": { "Id1": 3, "Id2": 9 } }] }] }
数据模型代码
namespace Data.Models { public class SensorsData { public string MacAddress { get; set; } public int TotalNodes { get; set; } public List<SensorReport> Report{ get; set; } public class SensorReport { public List<Status> Status { get; set; } } public class Status { public int ID { get; set; } public string Val { get; set; } public Nullable<int> HealthVal { get; set; } public List<sensorsRSSI> RSSI; public List<sensorsRoute> Route; } public class sensorsRSSI { public Nullable<int> Hop1 { get; set; } public Nullable<int> Hop2 { get; set; } } public class sensorsRoute { public Nullable<int> Id1 { get; set; } public Nullable<int> Id2 { get; set; } } public SensorsHealthData() { } } }
Controller代码片段
public IHttpActionResult Post(Data.Models.SensorsData sensorHealthData) { try { using (GSEntities dbContext = new GSEntities()) { var device= dbContext.devices.Where(c => c.MacAddress == SensorsData.HubMacAddress).FirstOrDefault(); foreach (SensorReport sensorReport in sensorData.HealthReport) { foreach (Status status in sensorReport.Status) { SensorsReport sensorReport = GSContext.SensorsReport.Add(new SensorsReport { Id = device.Id , TotalNodes = sensorData.TotalNodes, ID = status.ID, Val= status.Val, Hop1 = status.RSSI.Hop1, Hop2 = status.RSSI.Hop2, Id1 = status.Route.Id1, Id2 = status.Route.Id2 }); } }
问题排查与修复建议
1. 数据模型与JSON结构不匹配
Status类中RSSI和Route定义为List集合类型,但JSON里这两个字段是单个对象(非数组),反序列化后会直接为null,后续访问status.RSSI.Hop1必然触发空引用。
修复:将Status类中的集合类型改为单个对象,并添加get/set属性(JSON反序列化默认只处理属性,字段无法被赋值):public class Status { public int ID { get; set; } public string Val { get; set; } public Nullable<int> HealthVal { get; set; } // 从List改为单个对象,并添加属性访问器 public sensorsRSSI RSSI { get; set; } public sensorsRoute Route { get; set; } }
2. Controller变量与属性名称错误
- 方法参数是
sensorHealthData,但循环中误用了未定义的sensorData,同时遍历的HealthReport在数据模型中不存在,正确属性名是Report,这会导致遍历null集合触发异常。 - 查找设备时误用了不存在的静态属性
SensorsData.HubMacAddress,应改为参数的sensorHealthData.MacAddress:var device= dbContext.devices.Where(c => c.MacAddress == sensorHealthData.MacAddress).FirstOrDefault();
3. 缺失空值检查
device = ...FirstOrDefault()可能返回null(数据库中无对应MacAddress的设备),直接访问device.Id会触发空引用,必须先判断:if (device == null) { return BadRequest("未找到对应设备"); }- 循环前需检查
sensorHealthData.Report、sensorReport.Status是否为null,避免遍历null集合。
4. 模型构造函数错误
SensorsData类的构造函数名称写成了SensorsHealthData(),属于无效构造,应改为与类名一致,同时建议初始化集合避免后续空引用:
同理,public SensorsData() { Report = new List<SensorReport>(); }SensorReport类也建议在构造函数中初始化Status集合。
内容的提问来源于stack exchange,提问作者GHOST
相关产品推荐
相关产品推荐

