我在我的项目中使用了Microsoft.AspNet.WebApi.OData,但在使用 JSON 时遇到了一些问题(在我的情况下使用数字)。此外,OData 包有一些依赖项,在我看来,这些依赖项对于单个功能来说太大了(约 7MB 与所有依赖项)。
所以我开发了一个简单的库来满足你的要求:SimplePatch。
如何使用
使用以下命令安装包:
Install-Package SimplePatch
然后在你的控制器中:
[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();
}
该库也支持大量补丁:
[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();
}
如果使用实体框架,则只需在调用Patch
方法后添加两行代码:
entity.Patch(entityToPatch);
dbContext.Entry(entityToPatch).State = EntityState.Modified;
dbContext.SaveChanges();
Patch
此外,您可以在调用该方法
时排除一些要更新的属性。Global.asax 或 Startup.cs
DeltaConfig.Init((cfg) =>
{
cfg.ExcludeProperties<Todo>(x => x.id);
});
当您使用实体并且不想创建模型时,这很有用。