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?
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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With