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

ASP.NET Core Web API中JSON Patch未正确映射laboId与analyseId问题

ASP.NET Core Web API JSON Patch 字段被设为0的问题解决

问题原因分析

1. Patch操作基于空实体实例

如果你的代码是新建空的PcpsModel(或关联实体)实例再应用JSON Patch,未被Patch文档指定的字段会使用类型默认值(int类型默认是0)。正确逻辑应该是先从数据库查询出已存在的实体,再对该实例应用Patch,未修改的字段会保留数据库原有值。

2. Patch文档路径与实体属性名不匹配

检查JSON Patch文档中path字段的拼写,比如实体属性是LaboId,但Patch里写了/laboid或/labo_id,会导致模型绑定失败,字段被设为默认值0。即使ASP.NET Core默认大小写不敏感,也要确认序列化配置和属性命名规则一致。

3. 实体属性访问权限或EF配置问题

如果laboId和analyseId是私有属性、没有公开setter,JSON Patch无法正确赋值,最终保留默认值0。另外,如果这两个字段被EF Core配置为DatabaseGeneratedOption.Identity(自增主键),更新时EF Core可能会重置其值。

4. 请求参数绑定失败

即使你认为请求传入了正确值,也可能因为value类型不匹配(比如传字符串而非数字)、Patch文档格式错误,导致模型绑定失败,字段被设为默认值0。

解决方案

  • 基于数据库已有实体应用Patch
    代码示例:

    // 先从数据库获取目标实体
    var existingEntity = await _dbContext.PcpsModels.FindAsync(id);
    if (existingEntity == null)
    {
        return NotFound();
    }
    // 对已有实体应用Patch操作
    await _patchDocument.ApplyToAsync(existingEntity);
    // 后续验证与保存逻辑
    
  • 校验Patch文档的路径和值
    确保Patch请求的JSON格式正确,path与属性名匹配、value为正确数字类型:

    [
      {
        "op": "replace",
        "path": "/laboId",
        "value": 123
      },
      {
        "op": "replace",
        "path": "/analyseId",
        "value": 456
      }
    ]
    
  • 确保实体属性配置正确
    实体类属性需为public且包含getter、setter:

    public class PcpsModel
    {
        public int LaboId { get; set; }
        public int AnalyseId { get; set; }
        // 其他属性...
    }
    

    同时检查EF Core配置,确保字段未被设为自增:

    modelBuilder.Entity<PcpsModel>()
        .Property(p => p.LaboId)
        .ValueGeneratedNever(); // 若不是自增主键
    
  • 添加绑定验证日志
    在Action中添加日志,确认Patch文档是否正确接收:

    [HttpPatch("{id}")]
    public async Task<IActionResult> Patch(int id, [FromBody] JsonPatchDocument<PcpsModel> patchDocument)
    {
        _logger.LogInformation("Received Patch document: {PatchDoc}", patchDocument.ToString());
        // 后续逻辑...
    }
    
  • 手动保留关键字段值(临时方案)
    若上述方法无效,可在应用Patch前保存原有值,应用后再赋值回去:

    var originalLaboId = existingEntity.LaboId;
    var originalAnalyseId = existingEntity.AnalyseId;
    await _patchDocument.ApplyToAsync(existingEntity);
    // 若Patch未修改该字段,强制保留原有值
    if (!patchDocument.Operations.Any(op => op.Path.Equals("/laboId", StringComparison.OrdinalIgnoreCase)))
    {
        existingEntity.LaboId = originalLaboId;
    }
    if (!patchDocument.Operations.Any(op => op.Path.Equals("/analyseId", StringComparison.OrdinalIgnoreCase)))
    {
        existingEntity.AnalyseId = originalAnalyseId;
    }
    

内容的提问来源于stack exchange,提问作者Nadia akrach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:42:21