我正在使用Entity Framework API,并且尝试使用Put方法仅更新一列...
[ResponseType(typeof(void))]
[Authorize]
public IHttpActionResult PutLCTimeSlots(int id, LCTimeSlots lCTimeSlots)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != lCTimeSlots.id)
{
return BadRequest();
}
db.Entry(lCTimeSlots).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!LCTimeSlotsExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
我的问题,只更新一列我需要在此方法中进行哪些更改?
我尝试将db.Entry(lCTimeSlots).State = EntityState.Modified;
替换为db.Entry(lCTimeSlots).Property(x => x.taken).IsModified = true;
,但这没用。...有人有什么主意吗?
答案 0 :(得分:0)
您不应使用默认的PUT
进行此操作,因为这意味着客户端应该可以更新多个属性。我建议使用一种路由来进行PUT
操作,该操作描述的是使用属性类型的参数而不是LCTimeSlots
对象来描述要更新的属性:
[HttpPut( "{id}/yourProperty" )]
[Authorize]
public IHttpActionResult YourProperty( int id, TypeOfProperty yourProperty )
{
// validate value of `yourProperty` if you can before loading entity from DB
// load entity from DB
var loadedEntity = dbContext.Set<LCTimeSlots>().Find( id );
// if not found, 404 it
// update property, e.g.:
loadedEntity.YourProperty = yourProperty;
// validate entity in its entirety if necessary
// save changes
}
答案 1 :(得分:0)
如果您只想修改某些属性,我将建议使用PATCH动词。
此外,从客户端接受实体对象也不是一个好主意,而是接受仅具有旨在使用此方法修改的属性的模型对象。
最后,在尝试进行任何更改之前,请确保该实体存在。
现在,执行以下操作:
var timeSlot = db.LCTimeSlots.SingleOrDefault(e => e.Id == model.Id);
if (timeSlot != null)
{
db.Entry(timeSlot).CurrentValues.SetValues(model);
db.SaveChanges();
}
else
{
//404
}