C#会议室预订系统自动生成Null值及旧预订数据篡改问题求助
会议室预订程序数据异常问题
我正在开发一款C#会议室预订程序,用户从列表框选择联系人和会议室,点击按钮创建预订。首次预订成功,但使用其他用户预订另一会议室时,首次预订的Contact ID与Meeting ID被修改,同时生成了Contact和Meeting Room的Null值数据。
相关代码
Reservation Repository 代码
public void AddReservation(int roomid, int contactid, string subject, DateTime starttime, DateTime endtime, int invites) { MeetingRoom m = db.MeetingRooms.First(x => x.ID == roomid); Contact c = db.Contacts.First(x => x.ID == contactid); Reservation save = new Reservation(m, c, subject, starttime, endtime, invites); db.Reservations.Add(save); db.SaveChanges(); }
MainViewModel 执行流程代码
public void CreateCommandReservationAction() { if (SelectedContact != null && SelectedRoom != null && StartDate <= EndDate) { reservationRepository.AddReservation(SelectedRoom.ID, SelectedContact.ID, Subject, StartDate, EndDate, Invites); ResvList = reservationRepository.GetReservations(); } else { MessageBox.Show("Select a contact and a meeting room first."); } }
问题原因分析
- 实体关联配置错误:核心原因大概率是
Reservation与MeetingRoom、Contact的关联关系被错误配置为一对一。一对一关系下,一个会议室/联系人只能绑定一个预订,创建新预订时EF会覆盖原有关联的预订数据,同时可能因实体状态异常生成空值记录。 - EF上下文生命周期问题:如果
db(EF上下文)是单例或生命周期过长,上下文会持续跟踪之前加载的实体。创建新预订时,上下文可能错误地修改旧实体的关联关系,导致首次预订的ID被篡改。 - Reservation构造函数问题:如果构造函数中错误修改了传入的
MeetingRoom或Contact实体的状态,EF会将这些实体标记为需要更新,进而引发数据异常。 - 数据库表结构异常:
Reservations表的外键约束缺失或配置错误,导致EF的关系映射逻辑混乱,生成空值数据。
解决建议
- 修正实体关联配置:将
Reservation与MeetingRoom、Contact设为一对多关系。示例:- 在
MeetingRoom类中添加:public ICollection<Reservation> Reservations { get; set; } = new List<Reservation>(); - 在
Contact类中添加:public ICollection<Reservation> Reservations { get; set; } = new List<Reservation>(); - 在
Reservation类中保留外键属性和导航属性:public int MeetingRoomID { get; set; }、public MeetingRoom MeetingRoom { get; set; }(Contact同理)。
- 在
- 调整EF上下文生命周期:确保每个操作使用独立的上下文实例,避免单例上下文导致的实体跟踪混乱。
- 优化预订创建逻辑:直接通过外键ID创建预订,无需加载完整实体,减少跟踪问题:
public void AddReservation(int roomid, int contactid, string subject, DateTime starttime, DateTime endtime, int invites) { Reservation save = new Reservation { MeetingRoomID = roomid, ContactID = contactid, Subject = subject, StartTime = starttime, EndTime = endtime, Invites = invites }; db.Reservations.Add(save); db.SaveChanges(); } - 检查Reservation构造函数:确保构造函数仅初始化自身属性,不修改传入的
MeetingRoom或Contact实体的任何状态。
内容的提问来源于stack exchange,提问作者emirzhi
相关产品推荐
相关产品推荐

