首页 > 解决方案 > .NET 5 API 仅更新 JSON 上的字段(部分更新)

问题描述

我正在构建一个 .NET 5 API,但我遇到了一些问题。

我想知道是否可以仅更新我在 JSON 上发送的字段。

例如:

邮递员上的 JSON

{
    "id": 14,
    "name": "Pillar 1"
}

我的模型:

public class Pillar
  {
    [FromRoute]
    public int ID { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }

    public int IDEvaluationType { get; set; }
    
    [ForeignKey("IDEvaluationType")]
    public EvaluationType EvaluationType { get; set; }

    public ICollection<Competence> Competences { get; set; }
  }

我的 API 控制器

[HttpPut("{id}")]
        public async Task<IActionResult> PutPillar(int id, Pillar pillar)
        {
            if (id != pillar.ID)
            {
                return BadRequest();
            }

            _context.Entry(pillar).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!PillarExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return NoContent();
        }

但是当在 VS 上请求和调试时,我没有发送的所有数据都设置为 null 或 0:

调试

那就是用空值更新我的数据库,丢失我没有在 json 上发送的数据。我认为实体正在构建这样的查询:

更新支柱集 ID = 14,名称 = 'Pillar 123',IsActive = null,IDEvaluationType = null 其中 ID = 14

但是需要这样的查询:

更新支柱集名称 = 'Pillar 123' 其中 ID = 14

有没有办法只更新 JSON 上发送的字段?

谢谢你,有任何问题请告诉我。

标签: c#.netapi

解决方案


可以仅更改某些特定对象的字段子集,该操作称为“修补”。对于 REST 服务,您必须使用 PATCH 而不是 PUT,因为 PUT 总是意味着整个对象的更改。

微软网站上有一篇文章,如何实现 PATСH 请求处理,请看:https ://docs.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-5.0


推荐阅读