使用VS2017构建OData服务V2

时间:2018-10-24 22:53:06

标签: c# asp.net-web-api2 odata

我需要创建一个以OData V2格式发布数据的服务,因为使用该数据的系统仅接受此格式。 我创建了一个基于WEB API 2和EF的项目,该项目正在运行,但版本为3。 经过研究,我发现可以使用以下代码更改该版本:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
var odataVersion2 = new Version(1, 0);
builder.DataServiceVersion = odataVersion2;
builder.MaxDataServiceVersion = odataVersion2;

edmx文件已更改

<edmx:DataServices m:DataServiceVersion="1.0" m:MaxDataServiceVersion="1.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">

但是架构似乎是错误的。 例如,我有一个来自Northwind OData服务

<Schema Namespace="NorthwindModel" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">

我的文件有

<Schema Namespace="ODataServer.Models" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">

是否有任何方法可以真正表明OData服务必须遵循V2规范? 还是要强制使用正确的架构?

先谢谢您。 阿德里安

1 个答案:

答案 0 :(得分:0)

嗯,我能够解决问题。 方法“注册”应如下所示:

public static void Register(HttpConfiguration config)
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

    //Declare entities
    builder.EntitySet<Empleado>("Empleados");

    //Define verion
    Version odataVersion2 = new Version(2, 0);
    builder.DataServiceVersion = odataVersion2;
    builder.MaxDataServiceVersion = odataVersion2;

    IEdmModel edmModel = builder.GetEdmModel();
    edmModel.SetEdmVersion(odataVersion2);
    edmModel.SetEdmxVersion(odataVersion2);

    config.Routes.MapODataServiceRoute("odata", "odata", edmModel);

    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

现在EDMX具有所需的架构。

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
  <edmx:DataServices m:DataServiceVersion="2.0" m:MaxDataServiceVersion="2.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <Schema Namespace="ODataServer.Models" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
      <EntityType Name="Empleado">
        <Key>
          <PropertyRef Name="EmpleadoID" />
        </Key>
        <Property Name="EmpleadoID" Type="Edm.Int32" Nullable="false" />
        <Property Name="NroLegajo" Type="Edm.Int32" Nullable="false" />
        <Property Name="ApeNom" Type="Edm.String" Nullable="false" />
        <Property Name="FecIngreso" Type="Edm.DateTime" Nullable="false" />
        <Property Name="Email" Type="Edm.String" Nullable="false" />
        <Property Name="Proyecto" Type="Edm.String" />
      </EntityType>
    </Schema>
    <Schema Namespace="Default" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
      <EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
        <EntitySet Name="Empleados" EntityType="ODataServer.Models.Empleado" />
      </EntityContainer>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>