2017-09-15 132 views
7

我有一个ASP.NET Core 1.1 Web项目。如何实现最小控制器

我已经安装了Microsoft.OData.Core,并在http://odata.github.io/之后关联了“入门”。

两个页面上的以下链接为.NET 45

本月老SO answer链接Microsoft.AspNetCore.OData这不是微软的产品并在一年前最后更新。

这意味着SO answer“的OData支持在ASP.net核心”

我看到这个第三方解决方案AutoODataEF.Core自动生成但是控制器。

最后,我看到这个git issue表示ASP.Net Core的OData WebAPI即将推出,但最终目前还不可用。

假设我有一个Person模型和一个EF DbContext。

如何实现最小OData控制器?

回答

1

上asp.net芯netcoreapp2.0的OData,20180216

  1. 安装封装Microsoft.AspNetCore.OData -Pre {7.0.0-β1}

  2. 在Startup.cs

    public virtual void ConfigureServices(IServiceCollection services) 
    { 
        // ... 
        services.AddMvc(); // mvc first 
        services.AddOData(); // odata second 
    } 
    
    public virtual void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
        // ... 
        var builder = new ODataConventionModelBuilder(serviceProvider); 
        builder.EntitySet<SomeClass>(nameof(SomeClass).ToLower()).EntityType.HasKey(s => s.SomeId);   
        builder.EntitySet<OtherClass>(nameof(OtherClass).ToLower()).EntityType.HasKey(s => s.OtherId).MediaType(); // etc 
        var model = builder.GetEdmModel(); 
    
        app.UseMvc(routeBuilder => 
        {    
         routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(null).Count(); 
         routeBuilder.MapODataServiceRoute("ODataRoute", "data", model); // e.g. http://localhost:port/data/someclass?... 
         // insert special bits for e.g. custom MLE here 
         routeBuilder.EnableDependencyInjection(); 
         routeBuilder.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}"); // enable mvc controllers 
        });  
    } 
    
  3. 在SomeClassController.cs

    public class SomeClassController : ODataController // or just plain Controller 
    { 
        [EnableQuery] 
        [HttpGet] 
        [ODataRoute("someclass")] 
        public List<SomeClass> Get() // this should maybe be an IQueryable wrapped by an IActionResult/OkObjectResult 
        { 
         List<SomeClass> list = new List<SomeClass>(); 
         // however you do this 
         return list; 
        } 
    }