.net-core - 如何在 OData .net core 中修改 Delta Patch 中的对象

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

我有一个与补丁操作中的增量相关的问题。我想拦截对象并更新一个属性
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);
}

如何在我的 Controller 补丁功能中实现更新属性?

最佳答案

答案似乎比我想象的要容易得多。有 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);
}

关于.net-core - 如何在 OData .net core 中修改 Delta Patch 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799624/

相关文章:

.net-core - 系统.TypeLoadException : Could not load type 'Microsoft.EntityFrameworkCore.Infrastructure.DesignTimeProviderServicesAttribute'

wcf - 如何使用 EF 6 为 WCF 数据服务 (odata) 设置配置文件

json - 在 OData 客户端中展开 DataServiceQuery 时出错

exception - 将项目从.net Core 2.2迁移到3.0 Preview-7后,Swagger无法正常工作(引发异常)

c# - 如何在 dotnet 应用程序中创建导航菜单?

c# - 如何从 .Net 核心应用程序中的 SQL 语句获取标量值?

c# - 测试 FluentValidation ChildRules

c# - 在 OData 过滤器中缩短或省略枚举的命名空间

c# - 如何在 ASP.NET Core 集成测试中覆盖来自其他容器的 DI 注册

c# - ASP.NET Web API 自定义发布操作不起作用