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
相关产品推荐
相关产品推荐

