本文属于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. hive2

    4.hive优化 1)跑sql的时候会出现的参数: In order to change the average load for a reducer (in bytes): set hive.exe ...

  2. Jenkins-自动部署,备份

    Jenkins-自动部署,备份 问题导入: 环境: CentOS 7,   Tomcat 8.5,   Jdk 1.8,   Maven 3.25 ,Jenkins war包 2.x 原因: 每次部署 ...

  3. 攻防世界_MISC进阶区_Get-the-key.txt(详细)

    攻防世界MISC进阶之Get-the-key.txt 啥话也不说,咱们直接看题吧! 首先下载附件看到一个压缩包: 我们直接解压,看到一个文件,也没有后缀名,先用 file 看一下文件属性: 发现是是L ...

  4. 【渲染教程】使用3ds Max和ZBrush制作卡通风格的武器模型(上)

    克里斯蒂娜·马丁(CristinaMartín)介绍了她的项目灵剑(Spirit Sword)的制作过程,并详细的展示了使用3ds Max和ZBrush制作模型,纹理绘画和最终展示的过程. 介绍 克里 ...

  5. 实现strStr

    Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...

  6. 十六:SQL注入之查询方式及报错盲注

    在很多注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL查询语句有问题,这时候我们需要用到相关的报错或者盲注进行后续操作,同时作为手工注入的时候,需要提前了解SQL语句能更好的选择对应 ...

  7. 【Oracle】查看当前连接数和最大连接数

    查看当前数据库连接数 select count(*) from v$session where username is not null; select count(*) from v$process ...

  8. Electron小白入门自学笔记(一)

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14297176.html 一.从Hello Electron开始 创建一个空的文件夹, ...

  9. Tippy.js - 免费开源且高度可定制的气泡提示独立组件

    推荐一个非常优秀的 web 气泡提示独立UI组件. 介绍 Tippy.js 是一款用于Web的完整工具提示,弹出菜单,下拉菜单和菜单解决方案.适用于鼠标,键盘和触摸输入. 特点 超轻量的纯 javas ...

  10. 入门OJ:最短路径树入门

    题目描述 n个城市用m条双向公路连接,使得任意两个城市都能直接或间接地连通.其中城市编号为1..n,公路编号为1..m.任意个两个城市间的货物运输会选择最短路径,把这n*(n-1)条最短路径的和记为S ...