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

ASP.NET电商项目添加购物车时出现SqlException错误求助

解决SqlException:IDENTITY_INSERT为OFF时无法插入orderFactors标识列的问题

错误原因

你遇到的SqlException是因为在已有未完成订单的逻辑分支中,错误地对已经存在于数据库中的order实体再次执行了_context.orderFactors.Add(order)操作。此时这个order已经带有数据库自动生成的标识列值(OrderId),EF会尝试向数据库插入这条重复记录,触发了标识列的插入限制(IDENTITY_INSERT为OFF时不允许手动指定标识列值)。

修复代码

只需要删除那行多余的_context.orderFactors.Add(order)即可,修复后的完整代码如下:

public IActionResult AddToCart(int itemId)
{
    var product = _context.Products.Include(p => p.Item).SingleOrDefault(p => p.ItemId == itemId);
    if (product != null)
    {
        int userId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier).ToString());
        var order = _context.orderFactors.FirstOrDefault(o => o.UserId == userId && !o.IsFinally);
        if (order != null) 
        {
            var orderDetail = _context.orderDetails.FirstOrDefault(o => o.OrderId == order.OrderId && o.ProductId == product.Id);
            if (orderDetail != null) 
            {
                orderDetail.Count += 1;
            }
            else
            {
                _context.orderDetails.Add(new OrderDetail()
                {
                    OrderId = order.OrderId,
                    ProductId = product.Id,
                    price = product.Item.Price,
                    Count = 1
                });
            }
        }
        else
        {
            order = new OrderFactor()
            {
                IsFinally = false,
                CreateDate= DateTime.Now,
                UserId= userId

            };
            _context.orderFactors.Add(order);
            _context.SaveChanges();
            _context.orderDetails.Add(new OrderDetail()
            {
                OrderId = order.OrderId,
                ProductId = product.Id,
                price = product.Item.Price,
                Count = 1
            });
        }
        _context.SaveChanges();
    }
    return RedirectToAction("ShowCart");
}

补充说明

通过FirstOrDefault从数据库查询到的order实体,已经处于EF的跟踪状态,不需要再调用Add方法来标记为新增。你只需要直接操作关联的OrderDetail,EF会自动处理后续的变更提交。

内容的提问来源于stack exchange,提问作者AMIRALI GHAYOOMI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:25:32