2017-09-15 75 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; 
        } 
    }