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

Update record in EF not working as expected

我正在尝试在 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();

产品已找到,因为它 returns 200 好的。但是没有任何更新。我目前只是想更新描述。

我正在调用 api.com/api/products/update?InternalReferenceId=1&SupplierId=1,如前所述,它找到了一条记录。在 PUT 请求中,我有以下内容

{
  "description": "testing 123"
}

为什么不更新了?

试试这个代码:-

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();

您正在获取实体并按原样附加它,而没有分配新的 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. 使用 IDupdated column 的值发送 PUT 请求的 body 中实体的更新对象。
  2. 使用[FromBody]接收对象并将其附加到您的上下文中。
  3. SaveChanges.

像这样:

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;
}

你的 JSON 看起来像:

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

您要遵循的方法需要 object 实体至少具有其原始 ID 数据库,以便您可以直接将其附加到您的 dbContext。如果您不能在 requestbody 中发送 object 那么您不需要这些行:

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

由于您在 Entity framework 的连接模式下工作,因此无需使用 Attach 方法,在这种默认模式下,当您从数据库中获取对象时 Entity framework 将存储对象的状态并且当您调用方法 SaveChanges() Entity framework 时,将比较对象的状态并应用更改。当我们在断开连接模式下工作时,我们使用 Attach。在这种情况下,我们需要使用 Attach 将对象的状态提供给 Entity framework。