Сборка OData службы V2 с VS2017 - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно создать службу, которая публикует данные в формате 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">

, но схемы, похоже, неверны.Например, у меня есть один, взятый из службы OData Northwind

<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 голосов
/ 25 октября 2018

Ну, я смог решить проблему.Метод «Регистрация» должен быть таким:

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>
...