我正在尝试在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"
}
为什么不更新?
答案 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();
但最好的方法是:
body
PUT
和ID
的值updated column
[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;
}
。这样的事情:
{
"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框架。