Solía Microsoft.AspNet.WebApi.OData para mi proyecto y tuve algunos problemas al trabajar con JSON (trabajar con números en mi caso). Además, el paquete OData tiene algunas dependencias que, desde mi punto de vista, son demasiado grandes para una sola función (~ 7MB con todas las dependencias).
Así que desarrollé una biblioteca simple que hace lo que está pidiendo: SimplePatch.
Cómo utilizar
instalar el paquete usando:
Install-Package SimplePatch
Luego, en su controlador:
[HttpPatch]
public IHttpActionResult PatchOne(Delta<Todo> todo)
{
if (todo.TryGetPropertyValue(nameof(Todo.id), out int id)) {
// Entity to update (from your datasource)
var todoToPatch = Todos.FirstOrDefault(x => x.id == id);
if (todoToPatch == null) return BadRequest("Todo not found");
todo.Patch(todoToPatch);
// Now todoToPatch is updated with new values
} else {
return BadRequest();
}
return Ok();
}
El apoyo biblioteca de parches masiva también:
[HttpPatch]
public IHttpActionResult PatchMultiple(DeltaCollection<Todo> todos)
{
foreach (var todo in todos)
{
if (todo.TryGetPropertyValue(nameof(Todo.id), out int id))
{
// Entity to update (from your datasource)
var entityToPatch = Todos.FirstOrDefault(x => x.id == Convert.ToInt32(id));
if (entityToPatch == null) return BadRequest("Todo not found (Id = " + id + ")");
person.Patch(entityToPatch);
}
else
{
return BadRequest("Id property not found for a todo");
}
}
return Ok();
}
Si utiliza Entity Framework, hay que añadir sólo dos líneas de código después de la llamada al método Patch
:
entity.Patch(entityToPatch);
dbContext.Entry(entityToPatch).State = EntityState.Modified;
dbContext.SaveChanges();
Además, puede excluir algunas propiedades que actualizarse cuando se llama al método Patch
. Global.asax o Startup.cs
DeltaConfig.Init((cfg) =>
{
cfg.ExcludeProperties<Todo>(x => x.id);
});
Esto es muy útil cuando se está trabajando con una entidad y no desea crear un modelo.
Puede usar JsonPatch que es compatible con ASP.NET, ASP.NET Core y PCL para Xamarin. https://github.com/KevinDockx/JsonPatch. Un buen artículo se puede encontrar aquí http://benfoster.io/blog/aspnet-core-json-patch-partial-api-updates –
Ese es un problema diferente, creo. Mi modelo no está basado en json. La forma en que la actualización del estado real va a suceder debe depender del implementador. No quiero tener que traducir algunas especificaciones de RFC a una consulta SQL o mutaciones de entidades. –