正文转自:http://www.cnblogs.com/fzrain/p/3923727.html

前言

良长远没有更新了,之前来不少政工,所以拖了十分老,非常抱歉。好了,废话不多说,下面开始正题。本篇仍然采用上一季的的类别背景(系列地址http://www.cnblogs.com/fzrain/p/3490137.html)来演示OData服务,因此我们可以一直利用前建造好之数额访问层。但是未是说得要看看之前的具备情节,我们只是借数据库访问层,对于数据库的型构建移动(以Entity
Framework Code
First构建数据库模型)。

出矣数看的底子,我们好开构建OData服务了。

先是步:创建空的Web Api项目

图片 1

开辟项目的解决方案,新建web项目,选择空的web
api项目(如达到图所示),记得选择.Net Framework
4.5。建好路下要加上对“EntityFramework”和“Learning.Data”(我们的数码访问层)的援。

第二步:添加OData引用

在默认的状况下,Web
Api是力不从心支撑OData的,因此我们得加上对“Microsoft.ASP.NET Web API 2.1
OData”的援——打开NuGet如下图所示:

图片 2

第三步:配置OData路由

打开“App_Start”文件夹着网助我们创建的“WebApiConfig”类,在此间有一个Register方法并注册路由规则。我们用安排的OData也是摹写在这里,代码如下:

图片 3

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.Routes.MapODataRoute("elearningOData", "OData", GenerateEdmModel());
        }
        private static IEdmModel GenerateEdmModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EntitySet<Course>("Courses");
            builder.EntitySet<Enrollment>("Enrollments");
            builder.EntitySet<Subject>("Subjects");
            builder.EntitySet<Tutor>("Tutors");

            return builder.GetEdmModel();
        }
    }

图片 4

虽我们只是采用OData服务,但自我并不曾移除默认的配置为这点儿栽路由于规则是足以共存的。

方也咱的OData服务配置了路由于规则和实体数据模型(EDM)

EDM主要是定义数据类型、导航属性和措施来适应OData的格式。有2栽艺术来定义EDM,第一栽是根据公约的法子,我们以使“ODataConventionModelBuilder”类,另一样种植则是下“ODataModelBuilder”。

每当这边我们将采取“ODataConventionModelBuilder ”因为其见面基于我们定义之导航属性来很成涉集合的链接。相比来说写的代码比较少。如果您想以关乎集合间有更多之主宰,那么您可以运用“ODataModelBuilder”。

我们当builder对象吃补充加了4个不等之实业,注意:字符串参数“Courses”定义的实体集合名字务必同Controller的名字保持一致,也就是说我们的controller的名务必是“CoursesController”。

MapODataRoute”是一个恢宏方法,当我们添加对OData引用时便足以行使了。它至关重要也OData服务来定义路由规则之:第一个参数指定一个名字,这个名字客户端是匪会见用到之;第二只参数是赖对应OData终结点的URI前缀(在咱们的案列中做客Courses资源的URI就应该是:http://hostname/odata/Courses)。你可当与一个应用程序中负有多个OData终结点,只需要调用“MapODataRoute”方法指定不同之前缀就行了。

季步:添加第一个只读的OData控制器

今昔我们创建一个Web Api控制器来处理OData
URI类似“/odata/Courses”的HTTP请求。右击controller文件夹->新增->选择“空的API控制器”模板并取名“CoursesController”。

始建好下,首先用我们的基类改成为“System.Web.Http.OData.EntitySetController”。这个泛型基类需要2个参数:第一个指映射到此controller对应的实体类型;第二只参数是恃这实体主键的品种,下面上代码:

图片 5

public class CoursesController : EntitySetController<Course, int>
    {
        LearningContext ctx = new LearningContext();

        [Queryable(PageSize = 10)]
        public override IQueryable<Course> Get()
        {
            return ctx.Courses.AsQueryable();
        }

        protected override Course GetEntityByKey(int key)
        {
            return ctx.Courses.Find(key);
        }
    }

图片 6

“EntitySetController”类定义了很多架空和可重写的方式来更新与询问实体,因此而晤面发现你得重写很多底办法例如:Get(),GetEntityByKey(),CreateEntrty(),PatchEntity(),UpdateEntity(),etc…

凑巧使我前面提到的,我们拿创设一个但读的控制器,这虽意味着我们惟有兑现读取的操作,解释一下上面代码的兑现:

1.又写Get()方法并附着[Queryable]特性,这表示我们允许客户端发送HTTP的Get到我们的终结点并于URI参数值支持filter,order
by,pagination的操作。Queryable特性是一个action过滤器,主要转换与校验查询的URI及相应参数,当客户端询问将费很多时刻或大量多少上这特点将会生出竟的打算(举个例子:设置PageSize属性,这样一次性就见面吃客户端返回10久数据)

2.重新写GetEntityByKey(int
key)方法以支持客户端发送HTTP访问单个资源,形式类似于“/odata/Courses(5)”。注:这里的key代表对应实体的主键。

第五步:测试Courses控制器

现行咱们开测试我们的controller,对于持有的请我们还将accept
header指定为“application/json”,因此我们拿获取轻量JSON数据,你吗得以错过指定accept
header为“application/json;odata=verbose”或者“application/atom+xml”来查结果。

咱演示一下景象:

1.$filter:我们查询所有时长超过4时的学科:发送Get请求http://{hostname}/OData/Courses?$filter=Duration gt
4

2.$orderby,
$take:我们需要依据课程名为排序并获得前5漫漫记下:发送Get请求http://{hostname}/OData/Courses?$orderby=Name&$top=5

3.$select:我们只有得取Name和Duration字段的值:发送Get请求http://{hostname}/OData/Courses?$select=Name,Duration

4.$expand:我们用获得每个课程对应之主题以及讲师并依据课程名为倒序排列:发送Get请求http://{hostname}/OData/Courses?$expand=CourseTutor,CourseSubject&$orderby=Name desc

经过刚刚4单例子我们得看来于咱们的归来结果中富含了UserName和Password这点儿个字段,但单消息是没必要为客户端的。,

图片 7

死侥幸的是我们只需要去安排一下EDM就可以于回来结果负未含这片独字段了,具体做法在WebApiConfig类中之GenerateEdmModel()艺术里加入如下代码:

图片 8

private static IEdmModel GenerateEdmModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EntitySet<Course>("Courses");
            builder.EntitySet<Enrollment>("Enrollments");
            builder.EntitySet<Subject>("Subjects");
            builder.EntitySet<Tutor>("Tutors");
            var tutorsEntitySet = builder.EntitySet<Tutor>("Tutors");

            tutorsEntitySet.EntityType.Ignore(s => s.UserName);
            tutorsEntitySet.EntityType.Ignore(s => s.Password);

            return builder.GetEdmModel();
        }

图片 9

源码地址:https://github.com/fzrain/WebApi.eLearning

 

作者:FZRAIN

出处:http://fzrain.cnblogs.com/

正文版权归作者和博客园共有,欢迎转载,但未经作者同意要保留这个段子声明,且当文章页面明显位置被起原文连接,否则保留追究法律责任的权利。

 

相关文章

网站地图xml地图