C#调试时仓库入库系统控制器CartItems返回0问题求助
库存管理系统入库流程代码问题修复
现有代码核心问题
- 主键未生成就查询:你调用
_context.Add(receiving)之后还没有执行保存操作,receiving.Receiving_Id作为主键还没有生成有效值(数值类型默认是0),用这个值去匹配ReceivedItems.Id自然查询不到任何数据,返回结果为0。 - 查询逻辑关联错误:
ReceivedItems是入库单对应的明细条目,关联外键应该是入库单ID,而非自身主键等于入库单ID,你的过滤条件写反了关联关系。 - 库存更新逻辑错误:你每次循环都新建
Product对象,而不是查询当前要入库的已有商品再更新可用库存,会导致重复生成商品数据,且每次循环都覆盖receiving.Product属性,最终只有最后一条明细的修改会生效。 - 操作顺序错误:入库明细应该是和入库单一起提交到后台的,不需要新增入库单之后再去数据库查询明细,直接用参数中绑定的
receiving.Items即可。
修复后代码示例
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Receiving_Id,Supplier_Name,DateReceived,Receiver_Name,Receiver_Signature,Driver_Name,Driver_Signature,Items")] Receiving receiving) { if (ModelState.IsValid) { receiving.DateReceived = DateTime.UtcNow; // 先保存入库单获取生成的主键 _context.Add(receiving); await _context.SaveChangesAsync(); // 遍历本次入库的所有明细条目 foreach (var item in receiving.Items) { // 查询对应商品的已有记录 var product = await _context.Products.FirstOrDefaultAsync(p => p.Id == item.Product_Id); if (product != null) { // 可用库存累加本次收货数量,不是直接赋值 product.AvailableQuantity += item.Received_Quantity; _context.Update(product); } } // 保存库存修改 await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(receiving); }
额外注意点
- 如果你的入库明细
Items没有自动绑定到receiving对象,需要检查前端提交的字段名是否和模型属性名匹配,或者调整Bind属性包含的字段。 - 库存更新需要做累加操作,不要直接赋值,否则会覆盖之前的库存数量。
内容的提问来源于stack exchange,提问作者Raeesa Mahomed
相关产品推荐
相关产品推荐

