OData有多个键

时间:2015-06-25 14:29:30

标签: c# odata

我正在使用Microsoft.OData 6.11.0软件包,我希望能够允许API的用户使用三个属性之一(数据库主键,用户名或外部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>

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为您正在寻找的是与备用键类似的功能。

OData团队正致力于替代密钥支持。您可以从here

中找到详细信息和示例

此外,您可以找到正在进行的implementation