.net core 如何在OData.NETCore中修改增量补丁中的对象

.net core 如何在OData.NETCore中修改增量补丁中的对象,.net-core,odata,asp.net-core-webapi,patch,.net Core,Odata,Asp.net Core Webapi,Patch,我有一个关于补丁操作中delta的问题。我想截取对象并更新属性 Bacteria.nameShort=HTMLExtractHelper.RemoveUnwantedTags(Bacteria.name) 在每个更新/补丁上 我可以在put和post动词中轻松地完成这些操作,但是Delta对象似乎阻止我更新补丁中的属性 public async Task<IActionResult> Patch([FromODataUri] int key, [FromBody] Delta<

我有一个关于补丁操作中delta的问题。我想截取对象并更新属性

Bacteria.nameShort=HTMLExtractHelper.RemoveUnwantedTags(Bacteria.name)

在每个更新/补丁上

我可以在put和post动词中轻松地完成这些操作,但是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);
}
public异步任务修补程序([FromODataUri]int-key,[FromBody]Delta-Bacteria)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
//var entity=await _db.Bacterias.FindAsync(键);
var entity=_db.Bacterias.FirstOrDefault(i=>i.bacteriaID==key);
if(实体==null)
{
返回NotFound();
}
细菌斑片(实体);
尝试
{
等待_db.SaveChangesAsync();
}
catch(DbUpdateConcurrencyException)
{
如果(!细菌存在(键))
{
返回NotFound();
}
其他的
{
投掷;
}
}
更新申报表(实体);
}

如何在控制器补丁函数中更新属性?

答案似乎比我想象的要简单得多。TryGetPropertyValue和TrySetPropertyValue方法可用于获取和设置property对象上的值。下面是示例代码

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);
}
public异步任务修补程序([FromODataUri]int-key,[FromBody]Delta-Bacteria)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
//var entity=await _db.Bacterias.FindAsync(键);
var entity=_db.Bacterias.FirstOrDefault(i=>i.bacteriaID==key);
if(实体==null)
{
返回NotFound();
}
对象名称;
bool bFoundName=Bacteria.TryGetPropertyValue(“name”,out name);
if(bFoundName)
{ 
字符串nameShort=HTMLExtractHelper.RemoveUnwantedTags(name.ToString());
细菌TrySetPropertyValue(“名称短”,名称短);
}
细菌斑片(实体);
尝试
{
等待_db.SaveChangesAsync();
}
catch(DbUpdateConcurrencyException)
{
如果(!细菌存在(键))
{
返回NotFound();
}
其他的
{
投掷;
}
}
更新申报表(实体);
}