2016-11-04 60 views
1

我在Web API中创建了一个post方法来对一个表进行部分更新 - 以更改表中的Order Status字段。这里是我到目前为止:Web API的部分更新无法正常工作

public IHttpActionResult UpdateOrderStatus(Order ord) 
{ 
    try 
    { 
     if (!ModelState.IsValid) 
     { 
      throw new ProcessException("One or more values are invalid, please check."); 
     } 
     using (MyContext ctx = new MyContext()) 
     { 
      ord.StatusID = 3; 
      ctx.SaveChanges(); 

      return CreatedAtRoute("DefaultApi", new { id = ord.OrderID }, ord); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new ProcessException(ex.Message); 

    } 
} 

我通过代码,一切步进似乎是工作 - 没有错误,但数据库不会得到更新。我究竟做错了什么?

更新:

设置StatusID在对象将其传递到Web API方法之前:

变种的ord = { “订单ID” 1 “订购日期”:的currentdate, “StatusID” :3};

public IHttpActionResult UpdateOrderStatus(Order ord) 
{ 
    try 
    { 
     if (!ModelState.IsValid) 
     { 
      throw new ProcessException("One or more values are invalid, please check."); 
     } 
     using (MyContext ctx = new MyContext()) 
     { 
      ctx.Entry(ord).State = EntityState.Modified; 
      ctx.SaveChanges(); 

     return CreatedAtRoute("DefaultApi", new { id = ord.OrderID }, ord); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new ProcessException(ex.Message); 

    } 
} 
+1

两两件事:'Order.StatusID = 3;'大概应该是'ord.StatusID = 3',你可能需要此之后:'ctx.Entry(ORD).STATE = EntityState.Modified;' –

+0

这是使用实体框架?我怀疑问题在于你如何调用你的ORM。请标记您的ORM,或者如果手工制作,请包含MyContext的代码。如果直接调用方法会发生什么? – psaxton

+1

如果您使用的是EntityFramework,那么您需要通知关于您正在更新的Order对象的上下文。在EF6中,您通常会在名为Orders的上下文中拥有'DbSet'属性,所以我建议在设置'StatusID'之前添加'ctx.Orders.Attach(Order)'。 – Rob

回答

0

如果你使用的EntityFramework,那么你需要通知上下文你正在更新订单对象。在EF6您通常有所谓Orders的背景下DbSet财产,所以,如果你设置StatusID

0

试试这个代码,我建议增加ctx.Orders.Attach(Order):用ord.OrderID比较 获取orderEntity从数据库,然后更新StatusID的记录。

using (MyContext ctx = new MyContext()) 
     { 
      var orderEntity = ctx.Order.FirstOrDefault(x=> x.OrderID == ord.OrderID); 
      orderEntity.StatusID = 3; 
      ctx.SaveChanges(); 

     return CreatedAtRoute("DefaultApi", new { id = ord.OrderID }, ord); 
     }