C#中Put路由执行成功但数据未更新问题求助
问题描述
我正在重构C#代码,尝试编写一个新的更新方法。该方法执行成功,但实际并未更新数据。这是我首次在C#中实现此类功能,参考了一些博客但未发现与示例的差异。以下是我尝试的两种实现方案:
方案1
public async Task<BillableDto> PutBillable(Guid Id, BillableDto billable) { var view = await _context.Billables .Where(b => b.Id == Id) .SingleOrDefaultAsync(); if (view == null) throw new NotFoundException("BillableNotFound"); view.Id = billable.Id; view.Name = billable.Name; view.Cost = billable.Cost; view.Type = billable.Type; view.PunchId = billable.PunchId; view.Punches = billable.Punches; _context.Update(view); return new BillableDto { Id = view.Id, Name = view.Name, Cost = view.Cost, Type = view.Type, PunchId = view.PunchId, Punches = view.Punches }; }
方案2
public async Task<bool> PutBillable(Guid Id, BillableDto billable) { var view = await _context.Billables .Where(b => b.Id == Id) .SingleOrDefaultAsync(); if (view == null) throw new NotFoundException("BillableNotFound"); view.Id = billable.Id; view.Name = billable.Name; view.Cost = billable.Cost; view.Type = billable.Type; view.PunchId = billable.PunchId; view.Punches = billable.Punches; _context.Update(view); return true; }
解决建议
核心问题:未执行数据库保存操作
EF Core中,修改实体或调用Update方法后,必须执行await _context.SaveChangesAsync()才能将变更持久化到数据库。你的两个方案都遗漏了这一步,这是数据未更新的根本原因。代码优化要点:
- 移除冗余的
Update调用:通过上下文查询出的实体处于跟踪状态,修改属性后EF会自动标记为Modified,无需手动调用_context.Update(view)。 - 禁止修改主键
Id:主键是实体的唯一标识,更新时修改view.Id可能引发主键冲突或数据逻辑错误,建议删除view.Id = billable.Id这行代码。 - 返回更具意义的结果:方案2返回
true无法反映实际保存是否成功,建议返回更新后的BillableDto,或者返回SaveChangesAsync()的返回值(受影响的行数),以此验证操作有效性。
- 移除冗余的
修正后的示例代码:
public async Task<BillableDto> PutBillable(Guid Id, BillableDto billable) { var view = await _context.Billables .Where(b => b.Id == Id) .SingleOrDefaultAsync(); if (view == null) throw new NotFoundException("BillableNotFound"); view.Name = billable.Name; view.Cost = billable.Cost; view.Type = billable.Type; view.PunchId = billable.PunchId; view.Punches = billable.Punches; await _context.SaveChangesAsync(); // 关键:保存变更到数据库 return new BillableDto { Id = view.Id, Name = view.Name, Cost = view.Cost, Type = view.Type, PunchId = view.PunchId, Punches = view.Punches }; }
内容的提问来源于stack exchange,提问作者MambaForever
相关产品推荐
相关产品推荐

