Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to modify Object in Delta Patch in OData .net core

I have a question related to delta in the patch operations. I would like to intercept the object and update a property

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

on every update/patch.

I can do these easily in the put, and post verbs but the Delta object appears to be preventing me from updating the property in the patch.

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

How can I achieve updating a property inside my controllers patch function?

like image 592
John Bowyer Avatar asked Aug 31 '25 23:08

John Bowyer


1 Answers

The answer appears much easier than I thought. There are methods TryGetPropertyValue and TrySetPropertyValue which can be used to get and set values on the property object. Example code is below.

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);
}
like image 134
John Bowyer Avatar answered Sep 06 '25 09:09

John Bowyer