7

我有一个 ASP.NET Core 1.1 Web 项目。

我已经安装了Microsoft.OData.Core并按照链接下的“入门”并按照http://odata.github.io/

该页面上的以下两个链接均适用于 .Net 45

  • “<a href="http://odata.github.io/RESTier/#01-01-Introduction" rel="noreferrer">使用 RESTier 库构建 OData v4 服务”</li>
  • “<a href="http://odata.github.io/WebApi/#01-02-getting-started" rel="noreferrer">使用 OData WebApi 库构建 OData v4 服务”</li>

这个月旧的SO 答案链接到Microsoft.AspNetCore.OData,它不属于 Microsoft,最后一次更新是一年多前。

这个SO 答案意味着“ASP.net 核心中的 OData 支持”

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

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

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

如何实现最小的 OData 控制器?

4

1 回答 1

1

odata on asp.net core netcoreapp2.0, 20180216

  1. 安装包 Microsoft.AspNetCore.OData -Pre {7.0.0-beta1}

  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;
        }
    }
    
于 2018-02-10T14:24:48.443 回答