.NET Core 5下FirstOrDefault()查询存在的数据库数据却返回null问题
问题原因
出现该问题的核心原因如下:
- POST方法接收到的
Incidence实例Notifications_Id字段未正确绑定:你的GET方法将Incidence对象返回给视图后,视图没有为Notifications_Id字段设置表单提交项(如隐藏域),导致POST提交时该字段没有被传值,模型绑定后自动取int类型的默认值0,用0去数据库匹配自然找不到对应数据。 - 次要问题:代码中调用
_context.SaveChangesAsync()时没有加await关键字,异步保存逻辑不会等待执行完成,可能导致后续跳转后数据未更新的问题。 - 潜在问题:需确认
AssignedTickets和Incidence实体类的Notifications_Id字段类型,是否和数据库中对应表的字段类型完全一致,类型不匹配导致的隐式转换也可能造成匹配失败。
修复方案
方案1:补充视图表单绑定
在EditTicket对应的视图中添加Notifications_Id的隐藏字段,确保POST提交时该值会被传递到后端:
<!-- 用Razor语法添加隐藏域 --> <input type="hidden" asp-for="Notifications_Id" />
方案2:后端重新加载数据(更稳妥)
避免依赖前端传值,在POST方法中先根据传入incidence的主键重新从数据库加载完整数据,再拿加载后的数据做查询:
[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> EditTicket(Incidence incidence) { if (incidence.Id == null) { return StatusCode(400); } // 从数据库加载完整的Incidence数据,避免前端漏传字段 var dbIncidence = await _context.Incidences.FindAsync(incidence.Id); if (dbIncidence == null) { return StatusCode(401); } var role = _context.AssignedTickets.FirstOrDefault(a => a.Notifications_Id == dbIncidence.Notifications_Id); if (role == null) { return StatusCode(404); } role.Status = "C"; role.ClosedOn = DateTime.Now; if (ModelState.IsValid) { DateTime Timeup = (DateTime)role.ClosedOn; DateTime Timedown = (DateTime)role.CreatedOn; long DiffTicks = (Timedown - Timeup).Ticks; role.TurnAroundTime = Math.Abs(DiffTicks).ToString(); _context.Entry(incidence).State = EntityState.Modified; // 补充await等待异步保存完成 await _context.SaveChangesAsync(); return RedirectToAction("Dashboard", "Agent"); } return View(incidence); }
额外检查
确认AssignedTickets表和Incidences表的Notifications_Id字段类型,和实体类定义的类型完全一致,排除类型转换导致的匹配失败问题。
内容的提问来源于stack exchange,提问作者Nickson
相关产品推荐
相关产品推荐

