本文属于OData系列

目录


Introduction

OData不光提供了数据查询的便捷手段,它也提供了数据更新的方便办法。

传统WebAPI方式

一般用于数据更新的方式,最多的就是PUT和PATCH方法了。关于这两个方法的区别以及介绍,可以翻看我之前写的RESTful设计中的常见疑问

举例说明:

[AllowAnonymous]
[HttpPut]
[ProducesResponseType(typeof(ReturnData<CarInfo>), Status200OK)]
[ProducesResponseType(typeof(ReturnData<string>), Status409Conflict)]
public async Task<ActionResult> Put([FromBody] Models.CarInfo value)
{
var info = new Info<CarInfo>();
var res = await info.Put(value);
if (res != null) return Ok(new ReturnData<CarInfo>(res));
else return Conflict(new ReturnData<string>("数据已经存在"));
} [HttpPatch()]
[Authorize(Roles = "Administrator, Supervisor")]
[ProducesResponseType(typeof(ReturnData<CarInfo>), Status200OK)]
[ProducesResponseType(typeof(ReturnData<string>), Status404NotFound)]
public async Task<ActionResult> Patch([FromBody] Models.CarInfo value)
{
var info = new Info<CarInfo>();
var res = await info.Patch(value);
if (res != null) return Ok(new ReturnData<CarInfo>(res));
else return NotFound(new ReturnData<string>("无法找到原数据"));
} public async ValueTask<T?> Put(T value)
{
//只列出关键代码
var res = await dbset!.FindAsync(key.GetValue(value) as string); if (res != null)
{
//return null;
context.Entry(res).CurrentValues.SetValues(value);
}
else
{
value.CreateDate = DateTime.Now;
dbset.Add(value);
await context.SaveChangesAsync();
return value;
}
}

Put和Patch方法主要是实现数据库对应实体的替换逻辑,这里我就不贴详细的代码了。

可以发现,我需要传入的是一个CarInfo的对象,替换这个对象,我们就可以实现资源的更新了。

OData资源更新Delta

当然用上面这个方式可以实现资源的更新,不过也存在几个问题:

  • 需要传递较为完整的对象(其实这一点不太充分,现在的webapi不完整也能成功解析数据对象;
  • 无法追踪对象的变化;
  • 更新需要自己写逻辑实现;

OData提供了一个叫做Delta<>的泛型类,Delta就是Δ,物理里面一般用来表示变化量。OData的这个类,也是用来表示一个对象的变化的。

[Table("deviceinfo")]
public class DeviceInfo
{
[Key]
[MaxLength(200)]
public string DeviceId { get; set; }
public string CameraId { get; set; }
public string AppKey { get; set; }
public string AppSecret { get; set; }
public string Name { get; set; }
public string DeviceType { get; set; }
public string Location { get; set; }
public string Description { get; set; }
} [Produces("application/json")]
[ProducesResponseType(typeof(Order), Status200OK)]
[ProducesResponseType(Status400BadRequest)]
[Authorize(Roles ="Administrator")]
[ODataRoute("({id})")]
public async Task<IActionResult> Patch(string id, Delta<DeviceInfo> delta)
{
if (!ModelState.IsValid) return BadRequest(new ODataError() { ErrorCode = "400", Message = "Data is not valid" }); var infos = await _context.DeviceInfoes.FindAsync(id); delta.GetInstance().CameraId = infos.CameraId;
delta.Patch(infos);
//获得更改过的属性名称
var ps = delta.GetChangedPropertyNames();
await _context.SaveChangesAsync();
return Ok();
}

使用Delta<>的时候,不需要发送对象的全部属性,只需要发送变化的部分即可。对于上面的请求,我们只需要发送Key属性(用于确定数据)和变化的属性即可。另外,delta提供了追踪变化的一系列方法:GetChangedPropertyNames()之类的,可以很方便地继续手动处理,也提供了GetInstance()方法获得数据对象,可以很方便的进行拓展。

一般使用的话,Delta还提供Post和Put方法,和WebAPI定义的行为一致,这样用起来也非常直观。

总结

OData提供了Delta泛型,能够包装我们的数据对象,可以极大地简化资源更新的开发工作。

武装你的WEBAPI-OData资源更新Delta的更多相关文章

  1. OData 带更新的实例,并能取得元数据格式类型

    http://www.cnblogs.com/kid1412/p/6012938.html#CreateANewEntity <<ABP框架>> OData 集成   文档目录 ...

  2. OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client

    一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open protocol to allow the creation and consumption of quer ...

  3. AspNet WebApi OData 学习

    OData介绍:是一个查询和更新数据的Web协议.OData应用了web技术如HTTP.Atom发布协议(AtomPub)和JSON等来提供对不同应用程序,服务 和存储的信息访问.除了提供一些基本的操 ...

  4. [转]OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client

    本文转自:http://www.cnblogs.com/bluedoctor/p/4384659.html 一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open ...

  5. 基于Quick-cocos2d-x的资源更新方案 二

    写在前面 又是12点半了,对于一个程序员来说,这是一个黄金时间,精力旺盛,我想,是最适合整理和分享一些思路的时候了. 自从上次写了 基于Quick-cocos2d-x的资源更新方案 同样可见quick ...

  6. 基于Quick-cocos2d-x的资源更新方案 一

    图片来自网络 思绪何来 昨天写了一篇关于更新方案的理论 游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游) 今天继续细化一下 由于新项目采用的是Quick-cocos2d-x,那我就直接给出我 ...

  7. AspNet.WebAPI.OData.ODataPQ

    AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务 AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔) AspNet. ...

  8. AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔)

    AspNet.WebAPI.OData.ODataPQ 这是针对 Asp.net WebAPI OData 协议下,查询分页.或者是说 本人在使用Asp.Net webAPI 做服务接口时写的一个分页 ...

  9. 主攻ASP.NET MVC4.0之重生:Asp.Net MVC WebApi OData

    1.新建MVC项目,安装OData Install-Package Microsoft.AspNet.WebApi.OData -Version 4.0.0 2.新建WebAPI Controller ...

随机推荐

  1. idea或者java远程提交spark任务到yarn,Exception1

    spark通過idea远程提交job到yarn: Caused by: java.lang.ClassCastException: cannot assign instance of scala.co ...

  2. vue 过滤器 filter 的使用

    1.局部过滤器的使用 比如性别,订单状态的数据,后端一般返回数字来代替状态.以性别为模拟数据,0是未知,1是男,2是女. 直接数据渲染出来,只有012,没有性别 根据后端返回的int类型值,前端对数据 ...

  3. DEDECMS自动编号(序号)autoindex属性(转)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 让织梦dedecms autoindex,itemindex 从0到1开始的办法! 1 2 3 [field:global name=autoin ...

  4. 深入了解MySQL主从复制的原理

    欢迎微信关注「SH的全栈笔记」 0. 主从复制 首先主从复制是什么?简单来说是让一台MySQL服务器去复制另一台MySQL的数据,使两个服务器的数据保持一致. 这种方式与Redis的主从复制的思路没有 ...

  5. Spark推荐系统实践

    推荐系统是根据用户的行为.兴趣等特征,将用户感兴趣的信息.产品等推荐给用户的系统,它的出现主要是为了解决信息过载和用户无明确需求的问题,根据划分标准的不同,又分很多种类别: 根据目标用户的不同,可划分 ...

  6. 日常采坑:.NET Core SDK版本问题

    1..NetCore SDK版本问题 .NetCore3.1 webapi 部署linux,遇到一个坑,开启的目录浏览功能失效,几番尝试发现是版本问题.本地sdk版本与linux安装的sdk版本不对应 ...

  7. CVE-2019-15107_webmin漏洞复现

    一.漏洞描述 Webmin的是一个用于管理类Unix的系统的管理配置工具,具有网络页面.在其找回密码页面中,存在一处无需权限的命令注入漏洞,通过这个漏洞攻击者即可以执行任意系统命令.它已知在端口100 ...

  8. 【Linux】系统打开文件最大数量限制(进程打开的最大文件句柄数设置)

    利用ulimit命令可以对资源的可用性进行控制. -H选项和-S选项分别表示对给定资源的硬限制(hard limit)和软限制(soft limit)进行设置. 硬限制(hard limit)一旦被设 ...

  9. 入门OJ:售货员的难题

    题目描述 某乡有n个村庄(1<n<15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...

  10. Hive常用性能优化方法实践全面总结

    Apache Hive作为处理大数据量的大数据领域数据建设核心工具,数据量往往不是影响Hive执行效率的核心因素,数据倾斜.job数分配的不合理.磁盘或网络I/O过高.MapReduce配置的不合理等 ...