返回总目录


本篇目录

介绍###

OData其官网的定义是:

允许以一种 简单且标准的方式创建和使用可查询的、可互操作的RESTful APIs。

在ABP中也可以使用OData。Abp.Web.Api.OData nuget包简化了它的使用。

安装###

安装Nuget包

我们应该首先将Abp.Web.Api.OData nuget包安装到WebApi项目中:

Install-Package Abp.Web.Api.OData

设置模块依赖

给我们的WebApi项目设置的模块设置AbpWebApiODataModule的依赖。例如:

[DependsOn(typeof(AbpWebApiODataModule))]
public class MyProjectWebApiModule : AbpModule
{
...
}

请查看模块系统来理解模块依赖。

配置实体类

OData要求声明那些可以用作OData资源的实体。我们应该在WebApi项目模块的PreInitialize方法中处理这件事,如下所示:

[DependsOn(typeof(AbpWebApiODataModule))]
public class MyProjectWebApiModule : AbpModule
{
public override void PreInitialize()
{
var builder = Configuration.Modules.AbpWebApiOData().ODataModelBuilder; //Configure your entities here...
builder.EntitySet<Person>("People");
} ...
}

这里,我们得到了ODataModelBuilder的引用并设置了Person实体。类似地,你可以使用EntitySet来添加其他的实体。这里格外需要注意的是,括号里面的字符串People是指的控制器的前缀,这里我的控制器是PeopleController,当然你也可以设置为Persons等,我这里只是想说明要填的字符串更数据库的表名和自己定义的实体名没有关系。

查看使用ASP.NET Web API 2创建OData v4 终结点获取更多关于builder的信息。

创建控制器###

Abp.Web.Api.OData nuget包 包括了AbpODataEntityController基类(它扩展了标准的ODataController),这样就可以更容易地创建控制器了。下面是一个为Person实体创建一个OData终端(endpoint)的例子:

public class PersonsController : AbpODataEntityController<Person>
{
public PersonsController(IRepository<Person> repository)
: base(repository)
{
}
}

就是这么简单,AbpODataEntityController的所有方法都是virtual声明的。这意味着你可以重写 ** Get, Post, Put, Patch, Delete**和其他的action方法以及添加自己的逻辑。

例子###

下面看一个例子:

我的应用的端口是:localhost:61759。这里我只演示一些基本的东西,因为OData是一个标准的协议,所以你可以在网上轻松地找到更高级的例子。

数据库中People表的数据如下图:

获取实体列表

这里我来获取所有的Person:

获取单个实体

获取Id=2的那个Person的数据:

获取具有导航属性的单个实体

修改实体类的定义,重新定义如下:

Person实体的定义:

namespace ABPMVCTest.Entities
{
[Table("Persons")]
public class Person:Entity
{
public virtual string Name { get; set; }
public virtual bool Gender { get; set; }
public virtual string UserName { get; set; }
public virtual ICollection<Car> Cars { get; set; } public Person()
{
} public Person(string name, params Car[] cars)
{
Name = name;
if (cars!=null)
{
Cars=new Collection<Car>();
foreach (var car in cars)
{
car.Person = this;
Cars.Add(car);
}
}
}
}
}

Car实体的定义:

namespace ABPMVCTest.Entities
{
[Table("Cars")]
public class Car:Entity
{
public virtual Person Person{ get; set; }
public virtual int PersonId { get; set; }
public virtual CarBrand Brand { get; set; }
public virtual int Price{ get; set; } public Car()
{
} public Car(CarBrand brand, int price)
{
Brand = brand;
Price = price;
}
}
}

CarBrand(汽车品牌)实体的定义:

namespace ABPMVCTest.Entities
{
public enum CarBrand
{
Jeep,
Buick,
Lincoln,
Kia,
LandRover
}
}

修改实体类之后,接下来给数据库填充数据。新增了3个人,Id分别是7,6,9;在Car表中分别给这三个人分配了汽车,如下图:

比如获取小明(Id=7)的数据,它具有一个Car导航属性,该属性代表此人的汽车对象:

查询

下面将数据库的数据进行修改,如下图:

Persons表的数据:

Cars表的数据:

这里演示一个更高级的查询,包括过滤,排序和获取前2个结果,借助postman来演示:

查询条件是:Id<4,OrderBy UserName Desc,取前两条数据

请求

http://localhost:61759/odata/People?$filter=Id lt 4&$orderby=UserName&$top=2

响应

可以看到,只过滤出来了小红和小刚的数据。

OData支持分页,排序,过滤,投影以及更多。

请查看官方文档获取更多信息。

创建一个新实体

在这个例子中,我们将创建一个新的Person,借助postman,很容易发送一个post请求。

请求

注意这里的报文头为Content-Type:"application/json"

响应

去数据库查看一下,发现已经多了一条刚才post的数据:

当然了,我们也可以更新和删除实体,这里就不再做演示了,大家自行练习。

获取元数据【MetaData】

我们还可以获得实体的元数据,如下所示:

请求

http://localhost:61759/odata/$metadata

响应

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:DataServices>
<Schema Namespace="ABPMVCTest.Entities" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityType Name="Person">
<Key>
<PropertyRef Name="Id" /> </Key>
<Property Name="Name" Type="Edm.String" />
<Property Name="Gender" Type="Edm.Boolean" Nullable="false" />
<Property Name="UserName" Type="Edm.String" />
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<NavigationProperty Name="Cars" Type="Collection(ABPMVCTest.Entities.Car)" /> </EntityType>
<EntityType Name="Car">
<Key>
<PropertyRef Name="Id" /> </Key>
<Property Name="PersonId" Type="Edm.Int32" />
<Property Name="Brand" Type="ABPMVCTest.Entities.CarBrand" Nullable="false" />
<Property Name="Price" Type="Edm.Int32" Nullable="false" />
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<NavigationProperty Name="Person" Type="ABPMVCTest.Entities.Person">
<ReferentialConstraint Property="PersonId" ReferencedProperty="Id" /> </NavigationProperty> </EntityType>
<EnumType Name="CarBrand">
<Member Name="Jeep" Value="0" />
<Member Name="Buick" Value="1" />
<Member Name="Lincoln" Value="2" />
<Member Name="Kia" Value="3" />
<Member Name="LandRover" Value="4" /> </EnumType> </Schema>
<Schema Namespace="Default" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityContainer Name="Container">
<EntitySet Name="People" EntityType="ABPMVCTest.Entities.Person" /> </EntityContainer> </Schema> </edmx:DataServices> </edmx:Edmx>

样例项目###

你可以在Github上获得样例代码,点击查看

ABP理论学习之OData集成(新增)的更多相关文章

  1. ABP理论学习之SignalR集成

    返回总目录 本篇目录 介绍 安装 建立连接 内置功能 你自己的SignaR代码 介绍 Abp.Web.SignalR 使得在基于ABP的应用程序中使用 SignalR相当容易.查看SignalR文档获 ...

  2. ABP理论学习之NHibernate集成

    返回总目录 本篇目录 Nuget包 配置 实体映射 仓储 仓储基类 实现仓储 自定义仓储方法 阅读其他 ABP可以使用任何ORM框架工作,并且已经内置了NHibernate集成.这篇文章会解释如何在A ...

  3. ABP理论学习之EntityFramework集成

    返回总目录 本篇目录 Nuget包 创建DbContext 仓储 仓储基类 实现仓储 自定义仓储方法 阅读其他 ABP可以使用任何ORM框架工作,并且已经内置了EntityFramework集成.这篇 ...

  4. ABP理论学习之OWIN集成

    返回总目录 如果你的应用中使用了OWIN,那么需要在主项目(一般来说是指Web项目)中添加Abp.Owin的nuget包,然后像下面那样在OWIN的 Startup文件中调用 UseAbp()扩展方法 ...

  5. ABP官方文档翻译 5.3 OData集成

    OData集成 介绍 安装 安装Nuget包 设置模块依赖 配置实体 创建控制器 配置 示例 获取实体列表 Request Response 获取单个实体 Request Response 使用导航属 ...

  6. ABP框架 - OData 集成

    文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响应 查询 请求 响 ...

  7. ABP理论学习之Web API控制器(新增)

    返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...

  8. ABP理论学习之发布说明

    返回总目录 查看更详细信息以及下载源代码请查看原文档 ABP v0.9.2.0 | [更新日期:2016/6/6 11:21:28 ] 解决方案转换成xproj/project.json格式. 添加了 ...

  9. OData 集成

    OData 集成 文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响 ...

随机推荐

  1. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

  2. 在Mac上开启自带的Apache,httpd服务

    下面演示的是Mac自带的httpd服务 启动httpd服务 AppledeMacBook-Pro:python2_zh apple$ sudo apachectl start AppledeMacBo ...

  3. 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github

    一.关于NoSQL的项目需求 这些年在做AgileEAS.NET SOA 中间件平台的推广.技术咨询服务过程之中,特别是针对我们最熟悉的医疗行业应用之中,针对大数据分析,大并发性能的需求,我们也在慢慢 ...

  4. CA认证原理以及实现(上)

    转自:http://yale.iteye.com/blog/1675344 原理基础数字证书为发布公钥提供了一种简便的途径,其数字证书则成为加密算法以及公钥的载体,依靠数字证书,我们可以构建一个简单的 ...

  5. 【MongoDB初识】-其他操作

    又发现一种查询写法$wheredb.class.find({$}}) 排重db.class.distinct("stuCount") 一.MapReduce(摘录MongoDB实战 ...

  6. Java IO 操作(一)

    (1)File 类的基础用法 // 1.创建 一个file 对象File file = new File("D:\\aaa");// 2.判断此 file 是否是一个文件夹file ...

  7. 该不该在C#中使用var关键词

    作为一个并不勤快的程序猿,在项目开发过程中总是想尽办法少写代码,对var关键词的使用自然不会放过,几乎在每个能使用var的地方都用了var,对此,很多朋友同事给出了不同的建议,觉得能不使用var关键词 ...

  8. Struts相关

    使用Struts2流程: 1.导入Struts2类包 2.在Web源代码文件夹中,创建名为struts.xml的配置文件.在其中定义Action对象,其关键代码如下: struts.xml: < ...

  9. 问题2: 安装cocoaPods出现的一系列问题

    在新电脑上安装cocoaPods的时候,出现了一系列的问题,现在记录下来,方便查看 1.出现 Invalid mark letter (press RETURN) 解决方案:输入 :wq 即可 2.  ...

  10. 原生js移动端touch事件实现上拉加载更多

    大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: //获取要操作的元素 var objSection = document.ge ...