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

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()才能将变更持久化到数据库。你的两个方案都遗漏了这一步,这是数据未更新的根本原因。

  • 代码优化要点:

    1. 移除冗余的Update调用:通过上下文查询出的实体处于跟踪状态,修改属性后EF会自动标记为Modified,无需手动调用_context.Update(view)。
    2. 禁止修改主键Id:主键是实体的唯一标识,更新时修改view.Id可能引发主键冲突或数据逻辑错误,建议删除view.Id = billable.Id这行代码。
    3. 返回更具意义的结果:方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:35:07