我用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);
});
这是有用的,当你与实体工作,你不希望创建一个模型。
您可以使用支持ASP.NET,ASP.NET Core和PCL for Xamarin的JsonPatch。 https://github.com/KevinDockx/JsonPatch。好文章可以在这里找到http://benfoster.io/blog/aspnet-core-json-patch-partial-api-updates – 2016-11-10 05:13:54
这是一个不同的问题,我认为。我的模型不是基于json的。实际的状态更新将如何发生应该由实施者决定。我不想将某些RFC规范翻译成SQL查询或实体突变。 – 2016-11-10 05:18:52