OData v7 和 8 - 键值绑定时复合键应该按 Alpha Order 还是 HasKey?

OData v7 & 8 - Should Composite Keys be in Alpha Order or HasKey when key value binding?

Odata 在使用键值绑定约定时似乎希望键按字母顺序排列。

下面的文档建议它应该按照 HasKeys 中定义的顺序,因为键不是按字母顺序排列的。 https://docs.microsoft.com/en-us/odata/webapi/key-value-binding

但如果我下载 https://github.com/OData/AspNetCoreOData

更改以下文件的第 19 行以在 HasKey 定义中切换 FirstName 和 LastName https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Models/EdmModelBuilder.cs

调换人物模型文件中 2 个属性的顺序: https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Models/Person.cs

并更改以下文件第 48 行中 2 个参数的顺序: https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Controllers/PeopleController.cs

API 仍然期待 FirstName 优先:

这是预期的行为吗?

除了向 HttpGet 添加路由模板之外,我是否错过了确定键顺序的方法?

我更喜欢使用约定路由(HttpGet 中没有模板),我只是不确定是否有办法控制约定使用的键的顺序。

我正在将一个项目升级到 .Net 6、OData 8,我正在尝试将其移动到使用约定路由而不是模板指定路由,但目前的优先事项是保持路线相同。

链接到项目的是 .Net 5、OData 7,但我已经确认 .Net 6 和 OData 8 存在同样的问题。

这是 OData 模型构建器中的实现:

var keys = ((IEnumerable<PropertyConfiguration>)config.Keys)
                                     .Concat(config.EnumKeys)
                                     .OrderBy(p => p.Order)
                                     .ThenBy(p => p.Name)
                                     .Select(p => type.DeclaredProperties.OfType<IEdmStructuralProperty>().First(dp => dp.Name == p.Name));

它按 'Order' 属性 排序,然后按 属性 名称排序。 因此,您可以为 'Order' 设置不同的值以获得您想要的订单。

  1. 直接设置'Order'属性值
  2. 在 C# 属性 上使用 'ColumnAttribute' 属性。

已更新:

注意,在ODataRoutingSample中,FirstNameLastName是显式添加的(通过调用HasKey fluent API),所以,'ColumnAttribute'将是忽略明确添加的 属性.

所以,您应该直接设置订单值。以下代码应该有效:

builder.EntitySet<Person>("People").EntityType.HasKey(c => new { c.FirstName, c.LastName });
builder.EntityType<Person>().Property(c => c.FirstName).Order = 2;
builder.EntityType<Person>().Property(c => c.LastName).Order = 1;