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

如何使用C#在Web API中实现产品价格更新接口

C# Web API 产品价格更新接口实现说明

现有代码存在的问题

你提供的示例代码无法完成价格更新功能,核心缺陷是:查询到匹配的产品实体后,没有将入参中的新价格赋值给产品实体的对应字段,EF Core的变更跟踪器检测不到实体变动,调用SaveChangesAsync不会执行任何数据库更新操作,接口返回成功但实际数据无变化。

完整实现步骤

1. 前置依赖准备

  • 确保项目已经引入EF Core相关包,并且完成了DbContext(示例中的_db)的依赖注入配置
  • 定义合法的入参模型UpdateProductPrice,添加必要的数据校验规则:
public class UpdateProductPrice
{
    [Required(ErrorMessage = "产品ID不能为空")]
    public int ProductId { get; set; }

    [Required(ErrorMessage = "新价格不能为空")]
    [Range(0.01, double.MaxValue, ErrorMessage = "价格必须大于0")]
    public decimal NewPrice { get; set; }
}

2. 接口逻辑实现

遵循RESTful规范使用PUT请求做更新操作,修正后的完整逻辑如下:

[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
    private readonly YourDbContext _db;
    // 构造函数注入DbContext
    public ProductsController(YourDbContext db)
    {
        _db = db;
    }

    [HttpPut("update-price")]
    public async Task<IActionResult> UpdateProductPrice([FromBody] UpdateProductPrice model)
    {
        // .NET Core 3.1+ 加了[ApiController]特性会自动校验ModelState,非法参数直接返回400
        var product = await _db.ProductAndServices.FirstOrDefaultAsync(x => x.Id == model.ProductId);
        if (product == null)
        {
            return NotFound(new GlobalResponse { Status = false, Message = "Product not found" });
        }
        // 给产品实体赋值新价格
        product.Price = model.NewPrice;
        // 可选:记录更新时间
        product.UpdatedTime = DateTime.Now;
        
        await _db.SaveChangesAsync();
        return Ok(new GlobalResponse { Status = true, Message = "Product updated" });
    }
}

可选优化点

  • 增加幂等性校验:可以在入参中加版本号或者更新时间戳,防止重复提交导致的价格错误变更
  • 添加操作日志:价格变动属于敏感操作,建议记录操作人、变动前价格、变动后价格、操作时间等信息留痕
  • 并发控制:如果有多人同时操作同一个产品价格的场景,可以用EF Core的并发令牌处理并发冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:57:03