对API的PUT请求将值设置为NULL

问题描述

我下面有一个.Net Core API控制器,它可以执行PUT请求。

sql Server中受影响的表如下:

carID  (varchar(15),NULL)
optionID (varchar(15),NOT NULL)
optionDescription (varchar(255),NULL)
optionType (varchar(50),NULL)
factoryID (varchar(15),NULL)

在测试中,我正在通过PUT API调用发送要更改的属性

{
    " optionID": "633fr","optionDescription": "Full Tech Package A"
}

它确实更新了数据库中的条目,但是还将所有未在PUT调用中发送的值都设置为NULL。因此,尽管它确实更新了optionDescription,但它将除optionID之外的所有其他值都设置为NULL。

如何阻止它设置其他值?

谢谢!

这是控制器:

    // PUT: api/CarOptions/5
    [HttpPut("{id}")]
    public async Task<IActionResult> PutCarOptions(Guid id,CarOptions carOptions)
    {
        if (id != carOptions.OptionId)
        {
            return BadRequest();
        }

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

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

        return NoContent();
    }

解决方法

根据您的描述,建议您先尝试附加模型,然后将特定属性IsModified设置为true。

这只会更新特定字段,而不更新整个模型。

更多详细信息,您可以参考以下示例:

    // PUT: api/CarOptions/5
    [HttpPut("{id}")]
    public async Task<IActionResult> PutCarOptions(Guid id,CarOptions carOptions)
    {
        _context.Documents.Attach(carOptions);
        _context.Entry(carOptions).Property(x => x.optionDescription).IsModified = true;
        _context.SaveChanges();


        return NoContent();
    }