2016-03-02 45 views
0

以下是使用Entity Framework的Web Api 2項目中PUT方法的標準scafolding代碼。基於自定義ID的更新/放置方法?

當您擁有產品的ID時,此功能很好。

但是,我有一種情況,我想根據表中的唯一標識更新/放置一個產品,但將不同的字段'internalRef'(字符串)與製造標識結合使用。 所以,我首先希望檢查是否有一個產品internalRef ='123'和manufactureId = 1。如果不返回NotFound()。如果有,則使用發佈的數據更新該產品。

有關如何做到這一點的任何建議?

[Route("product/update")] 
[ResponseType(typeof(void))] 
public async Task<IHttpActionResult> PutProduct(int id, Product product) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    if (id != product.Id) 
    { 
     return BadRequest(); 
    } 

    db.Entry(product).State = EntityState.Modified; 

    try 
    { 
     await db.SaveChangesAsync(); 
    } 
    catch (DbUpdateConcurrencyException) 
    { 
     if (!ProductExists(id)) 
     { 
      return NotFound(); 
     } 
     else 
     { 
      throw; 
     } 
    } 

    return StatusCode(HttpStatusCode.NoContent); 
} 
+1

我真的不明白你的問題,你能不能改變Put方法簽名?! – Marco

+0

我懷疑我可以。但是如何?我覺得我有盲目的目光,看到明顯的 – brother

+0

就像這樣:public async Task PutProduct(string id,Product product)no? – Marco

回答

0

Put示例只是一個模板,您必須根據您的要求進行修改。你的情況是什麼讓你的實體獨特不是一個Id,而是一個InternalRef和一個製造商。所以你只需要替換/修改你的代碼來使用這個複合唯一的internalRef +製造商ID。

[Route("product/update")] 
[ResponseType(typeof(void))] 
public async Task<IHttpActionResult> PutProduct(string internalRef, int manufacturer, Product product) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    if (internalRef != product.InternalRef && manufacturer != product.Manufacturer) 
    { 
     return BadRequest(); 
    } 

    db.Entry(product).State = EntityState.Modified; 

    try 
    { 
     await db.SaveChangesAsync(); 
    } 
    catch (DbUpdateConcurrencyException) 
    { 
     if (!ProductExists(internalRef, manufacturer)) 
     { 
      return NotFound(); 
     } 
     else 
     { 
      throw; 
     } 
    } 

    return StatusCode(HttpStatusCode.NoContent); 
} 

記得自己ProductExists(string internalRef, int manufacturer)改變方法ProductExists(int id)正常工作。

+0

啊,看起來像我可以使用的東西。但我不確定這是什麼; internalRef!= product.InterRef。它檢查什麼?和ModelStat.IsValid,不會是假的,當tehre沒有int ID提交? – brother

+0

'internalRef!= product.InternalRef && manufacturer!= product.Manufacturer'檢查internalRef和製造商來自您將要更改的產品。如果沒有,你會改變一個不正確的產品。同樣的邏輯適用於'id!= product.Id在你的代碼中'。通過另一種方式,ModelState.IsValid將驗證由參數發送的Product實例,而不是id。檢查下一個鏈接以更好地理解它:http://www.exceptionnotfound.net/asp-net-mvc-demystified-modelstate/。 –

+0

我現在嘗試了你的suggstion,我得到錯誤「存儲更新,插入或刪除語句影響了意想不到的行數(0)」。然後我發現它在PUT中包含唯一的「id」屬性時起作用。但是,這是我想要避免的,因爲更新記錄的人不知道ID,但只有internalRef和manufactureId?我錯過了什麼嗎? :) – brother