如何使用LINQ-to-Entities将客户订单明细插入WinForms母婴店管理系统账单表
解决方案
1. 前置准备:创建订单明细实体
首先在你的数据库中新增订单明细表OrderDetailTB,表结构参考如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| DetailID | 自增主键 | 明细唯一ID |
| BillID | 字符串/数值 | 关联账单主表的账单ID(和你BillingTB的Biiling_ID字段对应) |
| ProductID | 数值 | 商品ID(可选,建议存储方便后续溯源) |
| ProductName | 字符串 | 商品名称 |
| UnitPrice | 十进制 | 商品单价 |
| BuyQuantity | 十进制 | 购买数量 |
| SubTotal | 十进制 | 该行商品小计 |
| CreateTime | 日期时间 | 订单创建时间 |
创建完表后更新EF实体模型,确保BabyHubEntities中可以访问到OrderDetailTBs数据集。
2. 修正原有逻辑的已知问题
你现有代码存在2个核心问题,需先调整:
- 仅扣减了当前选中的单个商品库存,没有对购物车(
DataGribBills)内所有商品做库存校验和扣减 - 总采购成本、总利润仅算了单个商品的数值,和实际整单金额不匹配
3. 新增订单明细存储逻辑
在你确认账单提交、成功写入BillingTB之后,遍历DataGribBills的所有行,逐行写入订单明细表即可,核心代码示例如下:
// 放在DBS.BillingTBs.Add(acc); DBS.SaveChanges(); 之后 if (result == DialogResult.Yes) { acc.SellerName = MainLogin.TBH_Login.Username; DBS.BillingTBs.Add(acc); DBS.SaveChanges(); MessageBox.Show("Transaction Added Successfully"); // ====== 新增:写入订单明细 start ====== // 遍历购物车所有商品行 foreach (DataGridViewRow row in DataGribBills.Rows) { // 跳过空行 if (row.IsNewRow) continue; OrderDetailTB detail = new OrderDetailTB(); detail.BillID = txtBill_ID.Text; // 关联同一个账单ID detail.ProductName = row.Cells[1].Value.ToString(); detail.UnitPrice = Convert.ToDecimal(row.Cells[2].Value); detail.BuyQuantity = Convert.ToDecimal(row.Cells[3].Value); detail.SubTotal = Convert.ToDecimal(row.Cells[4].Value); detail.CreateTime = acc.billDate; // 和主单同一个订单日期 DBS.OrderDetailTBs.Add(detail); } DBS.SaveChanges(); // ====== 新增:写入订单明细 end ====== // 这里记得把原来的利润、库存扣减逻辑改成遍历所有商品计算,避免数据错误 // 可根据你实际的商品ID存储逻辑,逐行查询商品库存做扣减、逐行计算采购成本累加 }
可选优化建议
- 新增事务包裹整个提交逻辑,避免出现主单写入成功、明细写入失败的数据不一致问题
- 提交前先遍历所有商品校验库存,所有商品库存都足够时再执行后续写入操作
- 提交完成后清空
DataGribBills和总金额变量,避免重复提交
内容的提问来源于stack exchange,提问作者Papa Yaw
相关产品推荐
相关产品推荐

