如何在OData .net Core中的Delta补丁中修改对象

时间:2019-06-28 00:06:35

标签: .net-core odata asp.net-core-webapi patch

我有一个与补丁操作中的增量相关的相当新手的问题。我想拦截对象并更新属性

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

如何实现更新控制器补丁函数中的属性?

1 个答案:

答案 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);
}