EF中的更新记录未按预期工作

时间:2016-03-03 06:39:12

标签: entity-framework asp.net-web-api asp.net-web-api2

我正在尝试在WebAPI PUT控制器中使用EF更新记录。我使用以下代码

        Product dbProduct = db.Products.FirstOrDefault(s => s.InternalReferenceId == InternalReferenceId && s.SupplierId == SupplierId);

    if (dbProduct != null)
    {
        db.Products.Attach(dbProduct);
        var entry = db.Entry(dbProduct);
        entry.Property(e => e.Description).IsModified = true;

        await db.SaveChangesAsync();
    }
    else
    {
        return NotFound();
    }

    return Ok();

找到产品,因为它返回200 Ok。但没有任何更新。我目前正在尝试更新说明。

我正在呼叫api.com/api/products/update?InternalReferenceId=1&SupplierId=1,如上所述,它会找到一条记录。在PUT请求中,我有以下

{
  "description": "testing 123"
}

为什么不更新?

3 个答案:

答案 0 :(得分:1)

您正在获取实体并按原样附加它,而不指定新的Description值。尝试使用现有代码:

Product dbProduct = db.Products.FirstOrDefault(s => s.InternalReferenceId == InternalReferenceId && s.SupplierId == SupplierId);

if (dbProduct != null)
{
    dbProduct.Description = "testing 123";
    await db.SaveChangesAsync();
}
else
{
    return NotFound();
}

return Ok();

但最好的方法是:

  1. 使用body PUTID的值updated column [FromBody]发送实体的更新对象。
  2. 使用SaveChanges接收对象并附上您的上下文。
  3. public bool Put([FromBody]Product updatedProduct) { db.Products.Attach(updatedProduct); var entry = db.Entry(updatedProduct); entry.Property(e => e.Description).IsModified = true; return db.SaveChanges() > 0; }
  4. 这样的事情:

    {
      "ProductID": 1, //id of your record to be updated.
      "InternalReferenceId": 1,
      "SupplierId": 1,
      "Description": "testing 123"
    }
    

    你的JSON看起来像是:

    object

    您要遵循的方法要求ID实体至少包含其原始dbContext数据库,以便您可以直接将其附加到object。如果您无法body request db.Products.Attach(dbProduct); var entry = db.Entry(dbProduct); entry.Property(e => e.Description).IsModified = true; 发送<tr ng-repeat="item in test.items"> <td> <input type="checkbox" ng-true-value="'{{item.name}}'" ng-model="selectedValues[$index]"/> </td> </tr> ,那么您就不需要这些内容:

    MAXROW = 20000 ' number of rows you have 
    'edit
    for i = 2 to MAXROW
        Range("N" & i).Select
        If Not IsError(Application.Match(Range("G"& i), Array("AR17 - Standard Report", "IT18 - Standard Report" , "CSYT - Standard Report" ), False)) Then
            'First statement
            ActiveCell.FormulaR1C1 =  "=IF(RC[-2]<=RC[-4],""Met"",""Not Met"")"
        else
            'Second
            ActiveCell.FormulaR1C1 = _
                "=IF(RC[-4]="""","""",IF(RC[-2]=""NA"",""N/A"",IF(RC[-2]=""N/A"",""N/A"",IF(RC[-2]>=RC[-4],""Met"",""Not Met""))))"
        endif
     Next
    

答案 1 :(得分:0)

试用此代码: -

var dbProduct = db.Products.FirstOrDefault(s => s.InternalReferenceId == InternalReferenceId && s.SupplierId == SupplierId);

        if (dbProduct != null)
        {
            dbProduct.Description="Bla Bla Bla ";
            db.Products.Attach(dbProduct);
            var entry = db.Entry(dbProduct);
            entry.Property(e => e.Description).IsModified = true;

            await db.SaveChangesAsync();
        }
        else
        {
            return NotFound();
        }

        return Ok();

答案 2 :(得分:0)

当您在Entity框架的Connected模式下工作时,不需要使用Attach方法,在此默认模式下,当您从数据库获取对象时Entity框架将存储对象的状态以及何时调用方法SaveChanges()Entity框架将比较对象的状态并应用更改。当我们在断开连接模式下工作时,我们使用Attach。在这种情况下,我们需要使用Attach将对象的状态赋予Entity框架。