2016-03-02 27 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