2016-11-04 57 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); 
     }