.NET Core 6停车位可用控制系统异常问题求助
停车位可用状态控制解决方案
核心问题分析
你当前的模型设计存在逻辑偏差:把表示停车位可用状态的Status字段放在了Booking(预订记录)实体中,这会导致每次新增预订时修改的是预订记录的状态,而非对应停车位的状态,根本无法实现对停车位可用性的控制。
1. 修正实体模型设计
需要拆分出独立的停车位实体和预订实体,让状态属性归属到停车位:
停车位实体(ParkingSlot)
public class ParkingSlot { public int Id { get; set; } public bool Status { get; set; } = true; // true=可用,false=已占用 public string SlotNumber { get; set; } // 停车位编号(示例属性) // 关联该车位的所有预订记录 public ICollection<Booking> Bookings { get; set; } = new List<Booking>(); }
预订实体(Booking)
public class Booking { public int Id { get; set; } public int ParkingSlotId { get; set; } // 关联的停车位ID public ParkingSlot ParkingSlot { get; set; } public int PickHours { get; set; } // 预订时长 // 可添加其他预订属性:用户ID、预订时间等 }
2. 修正控制逻辑
现在基于停车位的状态判断是否可预订,并修改对应车位的状态:
// 从前端获取要预订的停车位ID(假设obj包含ParkingSlotId和PickHours) var targetSlot = _db.ParkingSlots.FirstOrDefault(s => s.Id == obj.ParkingSlotId); if (targetSlot != null && targetSlot.Status) { // 创建新的预订记录 var newBooking = new Booking { ParkingSlotId = obj.ParkingSlotId, PickHours = obj.PickHours // 填充其他预订信息:如用户ID、创建时间等 }; _db.Bookings.Add(newBooking); // 修改目标停车位状态为不可用 targetSlot.Status = false; _db.SaveChanges(); TempData["success"] = "Booking created successfully"; } else { TempData["error"] = targetSlot == null ? "指定停车位不存在" : $"该车位已被预订,无法预订{obj.PickHours}小时"; return RedirectToAction("Index"); } return View(obj);
3. 若坚持原模型的临时修复(不推荐)
如果暂时不想调整模型,仅解决Status修改不生效的问题,可尝试显式标记属性修改:
if (obj.Status == true) { _db.Bookings.Add(obj); obj.Status = false; // 强制EF跟踪该属性的修改 _db.Entry(obj).Property(x => x.Status).IsModified = true; _db.SaveChanges(); TempData["success"] = "Booking created successfully"; } else { TempData["error"] = "This slot is already booked for " + obj.PickHours + " hours"; return RedirectToAction("Index"); } return View(obj);
内容的提问来源于stack exchange,提问作者Barış Aydoğdu
相关产品推荐
相关产品推荐

