You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:06:30