返回总目录


本篇目录

介绍###

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. ExtJS 中类的选项 - config

    首先看一个例子,我们在ExtJS中定义一个Window对象,代码如下: var win = Ext.create("Ext.window.Window", { title: '示例 ...

  2. [spring源码学习]九、IOC源码-applicationEventMulticaster事件广播

    一.代码实例 回到第IOC的第七章context部分,我们看源码分析部分,可以看到在spring的bean加载之后的第二个重要的bean为applicationEventMulticaster,从字面 ...

  3. 使用IntelliJ IDEA 配置Maven(入门)【转】

    1.在IntelliJ IDEA中配置maven 打开-File-Settings  2.新建maven WEB项目 打开-File-New-Project 点击NEXT  点击NEXT  添加的配置 ...

  4. Android Handler消息传递机制

    在Android系统中,类Handler主要有如下两个作用. 在新启动的线程中发送消息. 在主线程中获取.处理消息. 类Handler在实现上述作用时,首先在新启动的线程中发送消息,然后在主线程中获取 ...

  5. T-SQL Recipes之Common Function

    在我们写SQL的时候,经常会用到许多内置方法,简化了我们许多代码,也提高了效率,这篇主要总结一些常用的方法. ISNULL VS COALESCE VS NULLIF 在SQL中,NULL值是比较特殊 ...

  6. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

  7. POJ 1979 题解

    Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 31722   Accepted: 17298 D ...

  8. bzoj2743离线+树状数组

    奇葩染色,对于每一个点关心的是前前个同颜色的位置,但是处理方法相同 离线比较神奇,按照右端点排序,然后每次用的是左端点,就不用建可持久化树状数组(什么鬼)了 区间修改+单点查询 果断差分以后用树状数组 ...

  9. javascript 全局对象--w3school

    JavaScript全局对象 1.  decodeURI()解析某个编码的URI. 2.decodeURInComponent()解析一个编码的URI组件. 3.encodeURI()把字符串编码为U ...

  10. List<T>Find方法,FindAll方法,Contains方法,Equals方法

    假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...