实体框架API的Put方法,仅更新一列

时间:2018-09-19 15:36:49

标签: asp.net asp.net-mvc entity-framework

我正在使用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;,但这没用。...有人有什么主意吗?

2 个答案:

答案 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
        }