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

ASP.NET MVC中数据无法保存到SQL数据库问题求助

解决ReservationModel无法保存到SQL数据库且无错误提示的问题

1. 异步方法未等待导致执行不完整

你的CreateReservation是异步方法,但控制器调用时未使用await,会导致数据库操作可能还未完成就跳转页面,最终数据未写入。

修改控制器代码:

[HttpPost]
[Route("Home/Room/Create_reservation")]
public async Task<IActionResult> CreateReservation([Bind("Name")] ReservationModel reservationModel)
{
    await _reservation.CreateReservation((DateTime)TempData["Date"], (int)TempData["Id"], reservationModel.Name);
    return RedirectToAction("Index");
}

同时,数据保存方法建议改用异步版本的SaveChanges,保持异步逻辑一致性:

public async Task CreateReservation(DateTime date, int _id, string name)
{
    ReservationModel reservationModel = new ReservationModel { Cas = date, Name = name, Id = _id, Room= await _roomModel.GetRoom(_id) };

    await _db.Reservations.AddAsync(reservationModel);
    await _db.SaveChangesAsync();
} 

2. 主键Id的潜在冲突问题

ReservationModel的Id标记为[Key],如果数据库中该字段设置为自增主键,手动赋值Id = _id会引发两种问题:

  • 若_id已存在于数据库,EF会执行更新而非插入操作
  • 部分数据库不允许手动给自增列赋值,直接违反约束

解决方式:

  • 若预订的Id不需要关联房间Id,移除Id = _id的手动赋值,让数据库自动生成主键
  • 若必须手动设置Id,确保数据库中该字段未开启自增,且_id是数据库中不存在的唯一值

3. 未捕获异常导致错误被隐藏

当前代码无异常处理逻辑,异步方法未等待时,异常会被静默丢弃。添加异常捕获可快速定位问题:

public async Task CreateReservation(DateTime date, int _id, string name)
{
    try
    {
        ReservationModel reservationModel = new ReservationModel { Cas = date, Name = name, Id = _id, Room= await _roomModel.GetRoom(_id) };

        await _db.Reservations.AddAsync(reservationModel);
        await _db.SaveChangesAsync();
    }
    catch (Exception ex)
    {
        // 可记录日志或抛出异常让上层处理
        throw new Exception("保存预订失败", ex);
    }
}

4. TempData取值有效性验证

确保TempData["Date"]和TempData["Id"]存在且格式正确,避免因参数无效导致保存失败:

[HttpPost]
[Route("Home/Room/Create_reservation")]
public async Task<IActionResult> CreateReservation([Bind("Name")] ReservationModel reservationModel)
{
    if (!TempData.ContainsKey("Date") || !TempData.ContainsKey("Id"))
    {
        return BadRequest("缺少日期或房间ID参数");
    }

    if (!DateTime.TryParse(TempData["Date"].ToString(), out DateTime date) || !int.TryParse(TempData["Id"].ToString(), out int roomId))
    {
        return BadRequest("参数格式错误");
    }

    await _reservation.CreateReservation(date, roomId, reservationModel.Name);
    return RedirectToAction("Index");
}

内容的提问来源于stack exchange,提问作者fikus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:09:18