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>

谢谢!

解决方法:

我确实认为您正在寻找的功能类似于备用键.

OData团队正在研究备用密钥支持.您可以找到详细信息和来自here的样本

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

上一篇:c#-PageSize和MaxTop之间的区别


下一篇:c#-将OData添加到Web API 2,而无需耦合客户端和服务器