OData是否真的可以在Linux的AspNetCore中工作?

时间:2019-05-30 10:05:34

标签: asp.net-core odata

我在所有新工作都在AspNetCore中完成的环境中工作,主要原因之一是我们可以在Linux服务器上运行它。我们有一个API可以访问我们要求向其中添加OData的数据库之一。没问题。

问题

我有一个很好的示例,正​​在测试项目中工作,并将其移到代码annnnnnd的一个分支中的真实API中。那是什么?它是对Microsoft.AspNet的引用。

我的测试项目是.NetCore 2.1,安装的唯一NuGet软件包是:

  • Microsoft.AspNetCore.App v2.1.1
  • Microsoft.AspNetCore.OData v7.0.1(也尝试过v7.1.0)
  • Microsoft.AspNetCore.Razor.Design v2.1.2
  • Microsoft.NETCore.App v2.1.0

此(截断后的)代码在Windows开发计算机上非常有效,但是当我们尝试为Linux部署构建它时,我可以预见到问题。

Startup.cs -注意前2种用法

using Microsoft.AspNet.OData.Builder;
using Microsoft.AspNet.OData.Extensions;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.OData.Edm;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using ODataTest.Models;

namespace ODataTest
{
    public class Startup
    {
        ...
        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddOData();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ...
            app.UseMvc(b =>
            {
                b.Filter().Expand();
                b.MapODataServiceRoute("odata", "odata", GetEdmModel());
                b.EnableDependencyInjection();
            });
        }

        private static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<ThingDto>(nameof(ThingDto));
            return builder.GetEdmModel();
        }
    }
}

ThingController.cs -使用#3进行通知

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.OData;
using Microsoft.AspNetCore.Mvc;
using ODataTest.Models;

namespace ODataTest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ODataController
    {
        private readonly Db _db;
        public ValuesController(Db db)
        {
            this._db = db;
        }

        [HttpGet]
        [EnableQuery]
        public ActionResult<IEnumerable<ProductPricePointMarkdownDto>> Index()
        {
            var things =
                from thing in _db.Things
                select new ThingDto
                {
                    ThingID = thing.ID,
                    StyleID = thing.StyleID,
                    ColourID = thing.ColourID
                };

            return Ok(things);
        }
    }
}

ThingDto.cs -注意最后一次使用

using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNet.OData.Query;

namespace ODataTest.Models
{
    [Filter("ColourID", Disabled = true)]
    [Filter]
    public class ThingDto
    {
        [Key]
        public int ThingID { get; set; }
        public int StyleID { get; set; }
        public int ColourID { get; set; }
    }
}

任何人都可以使我摆脱目前认为OData“与Core协同工作”是营销的想法,实际上却不是吗?

1 个答案:

答案 0 :(得分:1)

因此答案是“是的,它确实起作用”。我还没有找到它是否是错误的名称空间,还是实际上是指.NET Standard。一旦我证明这是在Linux docker容器上运行的,发现动机就消失了。