OData 是否真的在 Linux 上的 AspNetCore 中工作?
Does OData actually work in AspNetCore on Linux?
我在一个所有新工作都在 AspNetCore 中完成的环境中工作,主要原因之一是我们可以在 Linux 服务器上 运行 它。我们有一个 API 来访问我被要求添加 OData 的数据库之一。没问题。
问题
我有一个在测试项目中工作的可爱示例,我正在将其移至代码分支中的真实 API annnnnnd.....那是什么?这是对 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
此 (t运行cated) 代码在我的 Windows 开发机器上运行良好,但我预见到当我们尝试为 Linux 部署构建它时会出现问题。
Startup.cs - 注意前两个用法
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 "works with Core" 是营销,而实际上它不是的想法吗?
所以答案是"Yes, it does work"。我没有查明它是一个错误的命名空间,还是实际上指的是 .NET Standard。一旦我在 Linux docker 容器上证明了这个 运行,就没有找到答案的动力了。
我在一个所有新工作都在 AspNetCore 中完成的环境中工作,主要原因之一是我们可以在 Linux 服务器上 运行 它。我们有一个 API 来访问我被要求添加 OData 的数据库之一。没问题。
问题
我有一个在测试项目中工作的可爱示例,我正在将其移至代码分支中的真实 API annnnnnd.....那是什么?这是对 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
此 (t运行cated) 代码在我的 Windows 开发机器上运行良好,但我预见到当我们尝试为 Linux 部署构建它时会出现问题。
Startup.cs - 注意前两个用法
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 "works with Core" 是营销,而实际上它不是的想法吗?
所以答案是"Yes, it does work"。我没有查明它是一个错误的命名空间,还是实际上指的是 .NET Standard。一旦我在 Linux docker 容器上证明了这个 运行,就没有找到答案的动力了。