Asp.net core ASP.NET Core 3.1 OData:无法按Id选择实体

Asp.net core ASP.NET Core 3.1 OData:无法按Id选择实体,asp.net-core,odata,Asp.net Core,Odata,我有一个OData端点(操作方法),它返回一个IQueryable项列表: [EnableQuery] public IQueryable<Entity> Get() 有什么我需要做的设置吗?我还尝试在模型中配置密钥: var odataBuilder = new ODataConventionModelBuilder(); odataBuilder.EntitySet<Student>("Entity").EntityType.HasKey(x => x.Id)

我有一个OData端点(操作方法),它返回一个
IQueryable
项列表:

[EnableQuery]
public IQueryable<Entity> Get()
有什么我需要做的设置吗?我还尝试在模型中配置密钥:

var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Student>("Entity").EntityType.HasKey(x => x.Id);

但我的印象是,这是不必要的,其他行动应该足够了。我错了吗?

根据我的研究和发现的例子,我认为这是不可能的,例如,总是需要一种专门的方法来解决这个问题。

TL;DR:使用ODataRoutePrefix+ODataRoute是因为
[Route(“api/[controller]”)]
无法处理单个可导航实体的OData
api/todo(10)

要获得
api/todo(10)
工作的OData约定:

//启动-配置()
app.UseEndpoints(端点=>
{
endpoints.Count().Filter().OrderBy().Expand().Select().MaxTop(100);
MapODataRoute(“odata”、“odata”、GetEdmModel())
.EnableDependencyInjection();
//[Route(“odata/[controller]”]//删除此
[ODataPrefix(“todo”)]//添加此
公共类TodoController:ODataController{
///odata/todo?$filter=id等式142
[启用查询]
公众可获得(
[FromServices]MyDataContext(数据上下文)
{
返回dataContext.Todo;
}
[启用查询]
[ODataRoute(“({id})”)]///odata/todo(142)
公共IActionResult GetByKey(
[FromODataUri]长id,
[FromServices]MyDataContext(数据上下文)
{
返回Ok(dataContext.Todo.SingleOrDefault(x=>x.Id==Id));
}
ASP.NET Core的OData示例均未使用
[ODataRoutePrefix]
[ODataRoute]
,但这些是使用OData约定进行路由所必需的
api/todo(10)

如果您在控制器上使用普通的
[Route(“api/[controller]”)
,在
GetByKey()
上使用
[Route({id})]
,则您的路由是

  • ~/api/todo/(10)
    -BADBAD
  • ~/api/todo(10)
    -很好
…后者是许多样本中使用的约定,包括


这似乎也破坏了
Created(todo)
POST
示例中使用的helper
Created(todo)
,因为它无法在Location头中找到
api/todo({newId})
要返回的路由。

在8.0 odata库中,它们似乎更喜欢
todo/10
而不是todo(10)`,这与标准REST资源和路由匹配。todo:测试“chain”通过8.0中的
todo/10
routes扩展并过滤odata操作符。对于搜索答案的人,为什么按Id获取不适用于方法,请检查参数名称。它应该是“key”:public Entity Get(int key)//works public Entity Get(int Id)//nope
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Student>("Entity").EntityType.HasKey(x => x.Id);
public Entity Get(int key)      //works