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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:31:03