具有多个键的OData

本文关键字:OData | 更新日期: 2023-09-27 17:59:55

我使用的是Microsoft.OData 6.11.0包,我希望能够允许API的用户使用三个属性(DB主键、用户名或外部ID号)中的一个作为表示人员的数据类型的键。属性的格式差异很大,可以很容易地进行区分。我设置OData模型如下:

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Person>("Person");
config.MapODataServiceRoute(
    routeName: "ODataRoute",
    routePrefix: "OData",
    model: builder.GetEdmModel());

在控制器中,我有:

[EnableQuery]
public SingleResult<Person> Get([FromODataUri] String key) {/*...*/}
[EnableQuery(PageSize = 100)]
public IQueryable<Widget> WidgetsFromPerson([FromODataUri] String key) {/*...*/}

其对提供了哪个标识符进行猜测并返回适当的数据。这些工作:

GET http://localhost/app/OData/Person(1234)
GET http://localhost/app/OData/Person(999999999)
GET http://localhost/app/OData/Person(1234)/Widgets
GET http://localhost/app/OData/Person(999999999)/Widgets

这些给我404分。

GET http://localhost/app/OData/Person('username')
GET http://localhost/app/OData/Person('username')/Widgets

如果我不能做到这一点,有没有其他语法可以用来按用户名获取人员以及按用户名获取该人员的小部件?

通过API返回的元数据包括:

<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
  <edmx:DataServices>
    <Schema Namespace="MyModel" xmlns="http://docs.oasis-open.org/odata/ns/edm">
      <EntityType Name="AbstractPerson" Abstract="true">
        <Key>
          <PropertyRef Name="PersonId" />
        </Key>
        <Property Name="PersonId" Type="Edm.Int32" Nullable="false" />
      </EntityType>
      <EntityType Name="Person" BaseType="MyModel.Person">
        <Property Name="UserName" Type="Edm.String" />
        <NavigationProperty Name="Widgets" Type="Collection(MyModel.Widget)" />
      </EntityType>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>

谢谢!

具有多个键的OData

我确实认为您正在寻找的是一个类似于备用键的功能。

OData团队正在研究备用关键支持。你可以在这里找到详细信息和样品

此外,您还可以找到正在进行的实施。