本文属于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. JavaScript入门-学习笔记(一)

    JavaScript入门(一) 学习js之前,我们先来了解一下,什么是JavaScript? JavaScript是一种解释型语言.在运行的时候,一边读一边编译一边执行.简单来说就是,在执行js代码时 ...

  2. Kubernetes官方java客户端之七:patch操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. FastApi学习(二)

    前言 继续学习 此为第二篇, 还差些知识点就可以结束, 更多的比如用户的身份校验/ swagger 文档修改等以后会单独写 正文 使用枚举来限定参数 可以使用枚举的方式来限定参数为某几个值之内才通过 ...

  4. Java 基于 mysql-connector-java 编写一个 JDBC 工具类

    用到的 jar 包 jar包地址: mysql-connector-java-5.1.47.jar junit-4.13.jar Maven: <!-- mysql驱动 --> <d ...

  5. 【Oracle】查看oracle用户相关权限

    系统权限 SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'CHAXUN' UNION ALL SELECT * FROM DBA_SYS_PRIVS WHER ...

  6. SDUST数据结构 - chap4 串

    函数题: 6-1 查找子串: 裁判测试程序样例: #include <stdio.h> #define MAXS 30 char *search(char *s, char *t); vo ...

  7. K8s遇到问题解决思路

    问题排查一 从describe去查找相应的deploy/pod/rs/svc [root@k8s-master ~]# kubectl describe po/nginx-f95d765f9-8b6b ...

  8. Netty学习:EventLoop事件机制

    目录 EventLoop是什么 EventLoop适用的场景 Netty中的EventLoop Netty中的大量inEventLoop判断 Netty是如何建立连接并监听端口的-NIOSocketC ...

  9. Pulsar vs Kafka,CTO 如何抉择?

    本文作者为 jesse-anderson.内容由 StreamNative 翻译并整理. 以三个实际使用场景为例,从 CTO 的视角出发,在技术等方面对比 Kafka 和 Pulsar. 阅读本文需要 ...

  10. 面试时通过volatile关键字,全面展示线程内存模型的能力

    面试时,面试官经常会通过volatile关键字来考核候选人在多线程方面的能力,一旦被问题此类问题,大家可以通过如下的步骤全面这方面的能力.     1 首先通过内存模型说明volatile关键字的作用 ...