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

.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时也会触发空引用。

修复方案

  1. 方法开头加入参校验,非法参数直接返回带错误提示的视图模型:
if (productTrademarkViewModel?.Product == null || productTrademarkViewModel.Product.TrademarkId <= 0)
{
    return new ProductTrademarkViewModel
    {
        Trademarks = _dbContext.Trademarks.ToList(),
        StatusMessage = "错误:提交的产品参数不合法"
    };
}
  1. 优化重复产品查询逻辑,直接用外键字段比较避免加载导航属性:
var checkExists = _dbContext.Products.Any(p => 
    p.ProductName == productTrademarkViewModel.Product.ProductName
    && p.TrademarkId == productTrademarkViewModel.Product.TrademarkId);
  1. 优化商标查询逻辑,先判断返回结果是否为空再访问属性:
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}"
};
  1. 新增成功后不要返回null,返回带成功状态的视图模型,避免上层调用空引用。

内容的提问来源于stack exchange,提问作者Sin Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:18:02