.NET Core 5新增Product时返回ID:-2147482647及空错误是什么原因
问题根因
观察到的Id: -2147482647是EF Core新增自增主键实体时的默认临时赋值,仅在SaveChanges()执行成功后会替换为数据库生成的真实主键,该值本身不属于报错原因,null错误来源于以下代码逻辑问题:
- 已存在分支的空引用风险
当产品重名判断checkExists.Any()为true时,构造返回值的代码中直接调用了SingleOrDefault()返回结果的TrademarkName属性,若对应TrademarkId不存在,SingleOrDefault()将返回null,直接访问成员就会触发空引用错误。 - 入参无合法性校验
方法未校验入参productTrademarkViewModel、productTrademarkViewModel.Product是否为null,若前端传参缺失对应对象,访问成员时会直接触发null错误。 - 新增分支返回值不合理
新增产品执行成功后直接return null,若上层调用逻辑未做null判断,直接访问返回对象的成员会触发空引用,这是新增操作时报错的最常见诱因。 - 查询逻辑存在空引用隐患
重复产品校验时用p.Trademark.Id做比较,若Product的Trademark导航属性未正确加载、或关联数据不存在,访问p.Trademark.Id时也会触发空引用。
修复方案
- 方法开头加入参校验,非法参数直接返回带错误提示的视图模型:
if (productTrademarkViewModel?.Product == null || productTrademarkViewModel.Product.TrademarkId <= 0) { return new ProductTrademarkViewModel { Trademarks = _dbContext.Trademarks.ToList(), StatusMessage = "错误:提交的产品参数不合法" }; }
- 优化重复产品查询逻辑,直接用外键字段比较避免加载导航属性:
var checkExists = _dbContext.Products.Any(p => p.ProductName == productTrademarkViewModel.Product.ProductName && p.TrademarkId == productTrademarkViewModel.Product.TrademarkId);
- 优化商标查询逻辑,先判断返回结果是否为空再访问属性:
var existTrademark = _dbContext.Trademarks.SingleOrDefault(t => t.Id == productTrademarkViewModel.Product.TrademarkId); var newProduct = new ProductTrademarkViewModel { Product = productTrademarkViewModel.Product, Trademarks = _dbContext.Trademarks.ToList(), StatusMessage = existTrademark == null ? "错误:指定商标不存在" : $"Error: {existTrademark.TrademarkName}" };
- 新增成功后不要返回null,返回带成功状态的视图模型,避免上层调用空引用。
内容的提问来源于stack exchange,提问作者Sin Lee
相关产品推荐
相关产品推荐

