【发布时间】:2015-04-09 17:30:45
【问题描述】:
我来自 Ruby on Rails API 背景,但目前正在研究 .NET C# WebAPI。我熟悉 C# 和 .NET 网络表单。
我正在尝试设置将更新数据库中的记录的 PUT 请求。脚手架方法会覆盖所有字段,而我只想更新通过 PUT 传递的字段。我尝试使用以下代码:
// PUT: api/Users/5
[ResponseType(typeof(void))]
public IHttpActionResult PutUser(string id, User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
User userToUpdate = db.Users.Where(u => u.id == id).FirstOrDefault();
if (userToUpdate == null)
{
return NotFound();
}
db.Entry(userToUpdate).CurrentValues.SetValues(user);
try
{
db.SaveChanges();
}
catch (DbUpdateException)
{
if (UserExists(id))
{
return Conflict();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
但是,该方法在 db.SaveChanges() 上失败,因为它无法覆盖“id”,这是一个键。 put请求是content-type: application/json,json如下:
{
"preferredEmailUpdates":"true"
}
这需要适用于所有字段并接受空条目。所以下面的内容也是有效的,应该用 null 更新字段电话。
{
"preferredEmailUpdates":"true",
"phone":null
}
如何在不更新密钥的情况下更新这些值?
【问题讨论】:
-
如果您不想设置所有值,则不能使用 CurrentValues.SetValues(),您必须单独复制每个字段。