我有一个与补丁操作中的增量相关的相当新手的问题。我想拦截对象并更新属性
Bacteria.nameShort = HTMLExtractHelper.RemoveUnwantedTags(Bacteria.name);
在每个更新/补丁上。
我可以轻松地在动词和后置动词中完成这些操作,但是Delta对象似乎阻止了我更新补丁中的属性。
public async Task<IActionResult> Patch([FromODataUri] int key, [FromBody] Delta<Bacteria> Bacteria)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//var entity = await _db.Bacterias.FindAsync(key);
var entity = _db.Bacterias.FirstOrDefault(i => i.bacteriaID == key);
if (entity == null)
{
return NotFound();
}
Bacteria.Patch(entity);
try
{
await _db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!BacteriaExists(key))
{
return NotFound();
}
else
{
throw;
}
}
return Updated(entity);
}
如何实现更新控制器补丁函数中的属性?
答案 0 :(得分:4)
答案似乎比我想象的要容易得多。有方法TryGetPropertyValue和TrySetPropertyValue,可用于获取和设置属性对象上的值。示例代码如下。
public async Task<IActionResult> Patch([FromODataUri] int key, [FromBody] Delta<Bacteria> Bacteria)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//var entity = await _db.Bacterias.FindAsync(key);
var entity = _db.Bacterias.FirstOrDefault(i => i.bacteriaID == key);
if (entity == null)
{
return NotFound();
}
object name;
bool bFoundName = Bacteria.TryGetPropertyValue("name", out name);
if (bFoundName)
{
string nameShort = HTMLExtractHelper.RemoveUnwantedTags(name.ToString());
Bacteria.TrySetPropertyValue("nameShort", nameShort);
}
Bacteria.Patch(entity);
try
{
await _db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!BacteriaExists(key))
{
return NotFound();
}
else
{
throw;
}
}
return Updated(entity);
}