我在所有新工作都在AspNetCore中完成的环境中工作,主要原因之一是我们可以在Linux服务器上运行它。我们有一个API可以访问我们要求向其中添加OData的数据库之一。没问题。
问题
我有一个很好的示例,正在测试项目中工作,并将其移到代码annnnnnd的一个分支中的真实API中。那是什么?它是对Microsoft.AspNet
的引用。
我的测试项目是.NetCore 2.1,安装的唯一NuGet软件包是:
此(截断后的)代码在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协同工作”是营销的想法,实际上却不是吗?
答案 0 :(得分:1)
因此答案是“是的,它确实起作用”。我还没有找到它是否是错误的名称空间,还是实际上是指.NET Standard。一旦我证明这是在Linux docker容器上运行的,发现动机就消失了。