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();
但最好的方法是:
- 使用
ID
和 updated column
的值发送 PUT
请求的 body
中实体的更新对象。
- 使用
[FromBody]
接收对象并将其附加到您的上下文中。
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
。如果您不能在 request
的 body
中发送 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。
我正在尝试在 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();
但最好的方法是:
- 使用
ID
和updated column
的值发送PUT
请求的body
中实体的更新对象。 - 使用
[FromBody]
接收对象并将其附加到您的上下文中。 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
。如果您不能在 request
的 body
中发送 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。