ABP理论学习之OData集成(新增)
本篇目录
介绍###
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集成(新增)的更多相关文章
- ABP理论学习之SignalR集成
返回总目录 本篇目录 介绍 安装 建立连接 内置功能 你自己的SignaR代码 介绍 Abp.Web.SignalR 使得在基于ABP的应用程序中使用 SignalR相当容易.查看SignalR文档获 ...
- ABP理论学习之NHibernate集成
返回总目录 本篇目录 Nuget包 配置 实体映射 仓储 仓储基类 实现仓储 自定义仓储方法 阅读其他 ABP可以使用任何ORM框架工作,并且已经内置了NHibernate集成.这篇文章会解释如何在A ...
- ABP理论学习之EntityFramework集成
返回总目录 本篇目录 Nuget包 创建DbContext 仓储 仓储基类 实现仓储 自定义仓储方法 阅读其他 ABP可以使用任何ORM框架工作,并且已经内置了EntityFramework集成.这篇 ...
- ABP理论学习之OWIN集成
返回总目录 如果你的应用中使用了OWIN,那么需要在主项目(一般来说是指Web项目)中添加Abp.Owin的nuget包,然后像下面那样在OWIN的 Startup文件中调用 UseAbp()扩展方法 ...
- ABP官方文档翻译 5.3 OData集成
OData集成 介绍 安装 安装Nuget包 设置模块依赖 配置实体 创建控制器 配置 示例 获取实体列表 Request Response 获取单个实体 Request Response 使用导航属 ...
- ABP框架 - OData 集成
文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响应 查询 请求 响 ...
- ABP理论学习之Web API控制器(新增)
返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...
- ABP理论学习之发布说明
返回总目录 查看更详细信息以及下载源代码请查看原文档 ABP v0.9.2.0 | [更新日期:2016/6/6 11:21:28 ] 解决方案转换成xproj/project.json格式. 添加了 ...
- OData 集成
OData 集成 文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响 ...
随机推荐
- VS2012调试时很慢的解决方案
1.转自http://guooge.com/archives/408.html VS2010调试极慢获取出现死机,因为启动了IntelliTrace Visual Studio 2010 Ulti ...
- (转) Android开发性能优化简介
作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...
- windows 常用命令整合--脚本工具
到年终了,手里活不多了,平时就想着将平时一些常用的命令整合一下,于是下面的一个小小脚本就出来了... 好了,直接上菜:(http://files.cnblogs.com/files/hsuchan/c ...
- Hackerrank11 LCS Returns 枚举+LCS
Given two strings, a and , b find and print the total number of ways to insert a character at any p ...
- 窗体Showmedol 遇到的奇怪异常: cannot make a visible window model
//窗体Showmedol 遇到的奇怪异常: cannot make a visible window model //背景:ShowModal A窗体,A窗体再ShowModal B窗体:A是透明背 ...
- Scrum项目7.0
队友: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...
- solr4.5安装配置 linux+tomcat6.0+mmseg4j-1.9.1分词
首先先介绍下solr的安装配置 solr下载地址 (我这用的solr-4.5.0) 运行环境 JDK 1.5或更高版本 下载地址(Solr 4以上版本,要求JDK 1.6) 我用的JDK1.6 ) ...
- gulp之压缩合并MD5清空替换加前缀以及自动编译自动刷新浏览器大全
gulp是基于流的前端构件化工具.目前比较火的前端构建化工具还是挺多的,grunt gulp fis3等等. 这个鬼东西有什么用?请参考https://www.zhihu.com/question/3 ...
- js实现下拉菜单
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- [资料分享]ACCESS2013 零基础到精通
Microsoft Office Access是由微软发布的关系数据库管理系统.它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft O ...