ASP.NET Web API 2 OData v4教程
创建项目
在VS中创建一个新的Asp.Net Web应用项目,命名为“PersonsService”,如下图:

安装Nuet包

搜索Microsoft.AspNet.Odata包跟EntityFramework包安装


添加Model类
Model类是一个表示应用中的数据实体的对象。
在解决方案资源管理器中的Models文件夹下,创建一个Person类:
namespace PersonsService.Models
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public bool Gender { get; set; }
public string UserName { get; set; }
}
}
生成数据库
打开Web.config文件,在configuration元素中添加下面的connectionStrings节点:
<connectionStrings>
<add name="PersonsContext" connectionString="Server=.;Database=PersonsDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
在Models文件夹下添加一个PersonsContext类:
using System.Data.Entity;
namespace PersonsService.Models
{
public class PersonsContext : DbContext
{
public PersonsContext()
: base("name=PersonsContext")
{
}
public DbSet<Person> Persons { get; set; }
}
}
打开NuGet包管理器,程序包管理器控制台输入以下命令 "enable-migrations" ,"add-migration","update-database "

这个时候打开SQL Server 就可以看到已经创建好的数据库

配置OData终结点
打开App_Start/WebApiConfig.cs文件,配置下面的新代码
using Microsoft.OData.Edm;
using PersonsService.Models;
using System.Web.Http;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;
namespace PersonsService
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//构建路由服务
config.MapODataServiceRoute(
routeName: "odata",
routePrefix: "odata",
model: GetModel()
);
}
private static IEdmModel GetModel()
{
var builder = new ODataConventionModelBuilder();
var esPerson = builder.EntitySet<Person>("Persons");
return builder.GetEdmModel();
}
}
}
上面的代码做了两件事:
- 创建了一个实体数据模型(Entity Data Model【简称EDM】)。
- 添加了一个路由。
EDM是一个抽象的数据模型。EDM用于创建服务元数据文档。ODataConventionModelBuilder类使用默认的命名规范创建了一个EDM。这种方式需要写的代码最少。如果你想更多地控制EDM,那么你可以使用 ODataModelBuilder类来创建EDM类,这样做就要显式添加属性,键和导航属性。
路由(route)会告诉Web API如何将HTTP请求路由到终结点。调用MapODataServiceRoute 扩展方法可以创建一个OData v4路由。
如果你的应用有了多个OData终结点,那么要为每个终结点创建一个单独的路由,给每个路由一个唯一的路由名和前缀(prefix)。
添加OData控制器
控制器是处理HTTP请求的一个类。在OData应用中,应该为每个实体集创建一个单独的控制器。而在这篇博客中,我们只要为Person实体创建一个控制器就行了。
在Controllers文件夹下添加一个控制器,如下:

修改控制器代码,如下:
using PersonsService.Models;
using System.Linq;
using System.Web.OData;
namespace PersonsService.Controllers
{
public class PersonsController : ODataController
{
private readonly PersonsContext db = new PersonsContext();
[EnableQuery]
public IQueryable<Person> Get()
{
return db.Persons;
}
[EnableQuery]
public IQueryable<Person> Get([FromODataUri] int key)
{
return db.Persons.Where(r=> r.Id==key);
}
}
}
这时我们手动给数据库添加些数据,

好了,现在我们运行项目尝试请求下
请求http://localhost:3370/odata/Persons

现在数据都出来了,试下请求单个Person
http://localhost:3370/odata/Persons(1)

一切正常
无参数的Get()方法会返回整个Person表的集合。
Get([FromODataUri] int key)方法会返回指定Id的Person。
[EnableQuery]特性允许客户端使用查询选项(如$filter,$sort和$page)修改查询。
添加一个Post方法来添加Person
[HttpPost]
public IHttpActionResult Post(Person person)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Persons.Add(person);
db.SaveChanges();
return Created(person);
}
使用post请求http://localhost:3370/odata/Persons

看下数据库赵六已经添加进去了,现在添加一个修改方法
OData支持两种不同语义更新实体,包括PATCH和PUT。
- PATCH执行一个部分更新,客户端只识别要更新的属性。
- PUT会替换整个实体。
PUT的劣势在于客户端必须发送实体的所有属性,包括没有改变的值。
OData说明书陈述了PATCH是首选。
[AcceptVerbs("PATCH", "MERGE")]
public IHttpActionResult Patch([FromODataUri] int key, Delta<Person> patch)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
Person person = db.Persons.Find(key);
if (person == null)
{
return NotFound();
}
patch.Patch(person);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
throw;
}
return Updated(person);
}
在PATCH中,控制器使用了Delta类型来跟踪改变。
删除实体
允许客户端从数据库删除一个Person:
// DELETE: odata/Persons(5)
public IHttpActionResult Delete([FromODataUri] int key)
{
Person person = db.Persons.Find(key);
if (person == null)
{
return NotFound();
} db.Persons.Remove(person);
db.SaveChanges(); return StatusCode(HttpStatusCode.NoContent);
}
后续会补充下odata配置自定义路由的问题.
Odata 自定义路由
[EnableQuery, HttpGet]
[ODataRoute("Products({id})/Default.GetCatAndTown")]
public IHttpActionResult GetCatAndTown([FromODataUri] int id)
{
var list = db.Products.Where(r => r.Id == id);
return Ok(list);
}
当然这个时候我们请求http://localhost:6785//Odata/Products(1)/Default.GetCatAndTown会报错404,解决方案是添加一个尾部的斜杠到请求的网址
这个时候我们http://localhost:6785//Odata/Products(1)/Default.GetCatAndTown/就会好了,具体原因不详。或者是修改web.config文件
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0Custom" path="/odata*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
ASP.NET Web API 2 OData v4教程的更多相关文章
- ASP.NET Web API基于OData的增删改查,以及处理实体间关系
本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先是比较典型的一对多关系,Supplier和Product. public class Product { ...
- [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系
本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...
- [转]ASP.NET web API 2 OData enhancements
本文转自:https://www.pluralsight.com/blog/tutorials/asp-net-web-api-2-odata-enhancements Along with the ...
- [转]ASP.NET Web API对OData的支持
http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html 在SOA的世界中,最重要的一个概念就是契约(contract).在云计算的 ...
- [转]Using $select, $expand, and $value in ASP.NET Web API 2 OData
本文转自:https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/using- ...
- 使用ASP.NET Web API 2创建OData v4 终结点
开放数据协议(Open Data Protocol[简称OData])是用于Web的数据访问协议.OData提供了一种对数据集进行CRUD操作(Create,Read,Update,Delete)的统 ...
- [转]使用ASP.NET Web API 2创建OData v4 终结点
本文转自:http://www.cnblogs.com/farb/p/ODataAspNetWebAPI.html 开放数据协议(Open Data Protocol[简称OData])是用于Web的 ...
- ASP.NET Web API系列教程目录
ASP.NET Web API系列教程目录 Introduction:What's This New Web API?引子:新的Web API是什么? Chapter 1: Getting Start ...
- ASP.NET Web API系列教程(目录)(转)
注:微软随ASP.NET MVC 4一起还发布了一个框架,叫做ASP.NET Web API.这是一个用来在.NET平台上建立HTTP服务的Web API框架,是微软的又一项令人振奋的技术.目前,国内 ...
随机推荐
- WPF软件开发系统之六——药品管理查询系统
本系统使用.Net WPF开发,运行于Windows操作系统,电脑或者触摸屏设备. 功能主要是药品按照各类条件检索及展示. 开发环境及工具: 首页: 按关键字查询: 按功效查询: 还有其它按拼音.按笔 ...
- c++字节对齐编译器指令#pragma
第一种 #pragma pack(push, 1) // 先把当前对齐设置压栈,再设置为1字节对齐 struct S { char a; ]; }; #pragma pack(pop) // 恢复先前 ...
- 免费了 -- EXCEL插件 智表ZCELL 普及版V1.0 发布了!!!
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- Greedy分饼干
分饼干:因为饼干大小和孩子的食欲度不一定是按大小顺序排列的,所以开始要排序一下,然后从最小的饼干依次从食欲小的孩子开始看,如果他愿意吃,就++,看下一个小孩子,这回拿的就是大一点的饼干了. Examp ...
- [LeetCode] 17. 电话号码的字母组合
题目描述:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/ 题目描述: 给定一个仅包含数字 2-9 的字符 ...
- Mysql基本命令及数据库存储位置
连接数据库: sudo mysql -p+密码 例如:sudo mysql -p123456 1.显示数据库列表. show databases; 2.显示库中的数据表: use mysql: //打 ...
- F2 - Spanning Tree with One Fixed Degree - 并查集+DFS
这道题还是非常有意思的,题意很简单,就是给定一个图,和图上的双向边,要求1号节点的度(连接边的条数)等于K,求这棵树的生成树. 我们首先要解决,如何让1号节点的度时为k的呢???而且求的是生成树,意思 ...
- JS中的事件委托(事件代理)
一步一步来说说事件委托(或者有的资料叫事件代理) js中事件冒泡我们知道,子元素身上的事件会冒泡到父元素身上. 事件代理就是,本来加在子元素身上的事件,加在了其父级身上. 那就产生了问题:父级那么多子 ...
- linux cp 直接覆盖不提示信息 解决方法
默认情况下,cp覆盖时,无论加什么参数 -f 之类的 还是提示是否覆盖. 原因是:服务器会默认增加别名 alias cp=’cp -i’,当你执行cp时,其实执行的是cp –i. [root@ltt0 ...
- ADC获取滑块的值(8通道)
#include "TgcConfig.h"#include "my_usb.h" /************************************* ...