C# Entity中删除空库存产品及关联空产品组的实现方案
实现删除产品后自动清理空产品组的功能
没问题,我来帮你完成这个扩展需求!咱们先梳理下逻辑:删除目标产品之后,得先拿到它所属的产品组ID,接着检查这个组里所有剩余产品的库存总和是否全为0或null,如果整个组的产品都没有库存了,就把这个产品组也一起删掉。
另外先提个小优化:你的现有代码里手动调用entities.Dispose(),不如用using语句包裹DbContext,它会自动帮你管理资源释放,更安全也更简洁。
下面是修改后的完整代码,每一步都加了注释:
public int Get(int? id) { // 使用using自动管理DbContext的生命周期,避免内存泄漏 using (JalkahoitolaEntities entities = new JalkahoitolaEntities()) { // 1. 查询目标产品的库存总和 List<int?> items = (from o in entities.Recieved_ammounts where o.ProductId == id select o.UnitStock).ToList(); decimal? totalStock = items.Sum(); // 2. 判断是否需要删除该产品 if (totalStock == null || totalStock == 0) { Product productToRemove = entities.Products.FirstOrDefault(o => o.ProductId == id); if (productToRemove != null) // 确保产品存在 { // 先记录产品所属的组ID,避免删除后拿不到 int? groupId = productToRemove.GroupId; // 删除产品并保存到数据库 entities.Products.Remove(productToRemove); entities.SaveChanges(); // 3. 如果产品属于某个组,才继续检查组的状态 if (groupId.HasValue) { // 查询该组下所有的产品 var groupProducts = entities.Products.Where(o => o.GroupId == groupId.Value).ToList(); // 标记该组是否所有产品都无库存 bool isGroupEmpty = true; foreach (var product in groupProducts) { // 计算当前产品的库存总和 var productStock = entities.Recieved_ammounts .Where(r => r.ProductId == product.ProductId) .Select(r => r.UnitStock) .Sum(); // 如果有任意一个产品库存不为0且不为null,说明组不是空的 if (productStock != null && productStock > 0) { isGroupEmpty = false; break; } } // 4. 如果组内所有产品都无库存,删除该产品组 if (isGroupEmpty) { var productGroup = entities.ProductGroups.FirstOrDefault(g => g.GroupId == groupId.Value); if (productGroup != null) { entities.ProductGroups.Remove(productGroup); entities.SaveChanges(); } } } } } } return 1; }
关键细节说明:
- 先记录GroupId:在删除产品之前先获取它的
GroupId,避免删除产品后无法关联到对应的组。 - 双重校验:删除产品后,遍历组内所有产品,逐个计算库存总和,确保没有遗漏任何有库存的产品。
- 空值处理:全程考虑了
UnitStock、GroupId可能为null的情况,避免空引用异常。 - 资源管理:用
using替代手动Dispose,符合.NET的最佳实践。
如果你的产品组实体类名称不是ProductGroups,记得改成你实际的类名哦!
内容的提问来源于stack exchange,提问作者Firas
相关产品推荐
相关产品推荐

