如何使用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
相关产品推荐
相关产品推荐

