2016-08-15 2 views
1

Я пытаюсь использовать OData V4-сервис. Служба имеет это соответствующие метаданные:Ошибка при использовании службы OData. Существует несоответствие типа между клиентом и службой.

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0"> 
    <edmx:DataServices> 
     <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Some.Name.Space"> 
      <EntityType Name="StatisticalProgram"> 
       <Key> 
        <PropertyRef Name="Id"/> 
       </Key> 
       <Property Name="Name" Type="Edm.String"/> 
       <Property Name="ShortName" Type="Edm.String"/> 
       <Property Name="Deployed" Type="Edm.Boolean" Nullable="false"/> 
       <Property Name="CreatedBy" Type="Edm.String"/> 
       <Property Name="CreatedDate" Type="Edm.DateTimeOffset" Nullable="false"/> 
       <Property Name="UpdateBy" Type="Edm.String"/> 
       <Property Name="UpdatedDate" Type="Edm.DateTimeOffset"/> 
       <Property Name="Id" Type="Edm.Guid" Nullable="false"/> 
      </EntityType> 
     // Other.... 

Что я пытаюсь сопоставить эту модель:

[DataServiceKey("Id")] 
public class StatisticalProgram 
{ 
    public string Name { get; set; } 
    public Guid Id { get; set; } 
    public string ShortName { get; set; } 
} 

Я использую Fiddler прослушивает запросы, и как запрос и выглядит ответ оК, но я получаю эту ошибку:

There is a type mismatch between the client and the service. Type '[Namespace].StatisticalProgram' is not an entity type, but the type in the response payload represents an entity type. Please ensure that types defined on the client match the data model of the service, or update the service reference on the client.

Все отлично работает, если я использую другой источник, как odata.org.

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0"> 
    <edmx:DataServices> 
     <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="ODataDemo"> 
      <EntityType Name="Product"> 
       <Key> 
        <PropertyRef Name="ID"/> 
       </Key> 
       <Property Name="ID" Type="Edm.Int32" Nullable="false"/> 
       <Property Name="Name" Type="Edm.String"/> 
       <Property Name="Description" Type="Edm.String"/> 
       <Property Name="ReleaseDate" Type="Edm.DateTimeOffset" Nullable="false"/> 
       <Property Name="DiscontinuedDate" Type="Edm.DateTimeOffset"/> 
       <Property Name="Rating" Type="Edm.Int16" Nullable="false"/> 
       <Property Name="Price" Type="Edm.Double" Nullable="false"/> 
       <NavigationProperty Name="Categories" Type="Collection(ODataDemo.Category)" Partner="Products"/> 
       <NavigationProperty Name="Supplier" Type="ODataDemo.Supplier" Partner="Products"/> 
       <NavigationProperty Name="ProductDetail" Type="ODataDemo.ProductDetail" Partner="Product"/> 
      </EntityType> 
      // Other 

и карта этой модели:

public class Product 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

Мой клиент класс для потребляющих его выглядит следующим образом:

public class MyClient<T> where T : class 
{ 
    private readonly Uri _uri; 
    private readonly string _entitySetName; 

    public MyClient(Uri uri, string entitySetName) 
    { 
     _uri = uri; 
     _entitySetName = entitySetName; 
    } 

    public IQueryable<T> Entities() 
    { 
     var context = new DataServiceContext(_uri, ODataProtocolVersion.V4); 
     context.Format.LoadServiceModel = GenerateModel; 

     DataServiceQuery<T> query = context.CreateQuery<T>(_entitySetName); 
     return query; 
    } 

    private IEdmModel GenerateModel() 
    { 
     ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<T>(_entitySetName); 
     return builder.GetEdmModel(); 
    } 
} 

И я использую его, как это для Product (отлично работает):

var uri = new Uri("http://services.odata.org/V4/OData/OData.svc"); 
var myClient = new MyClient<Product>(uri, "Products"); 
var result = myClient.Entities().ToList(); 

Или как это для StatisticalProgram (не работает):

var uri = new Uri("http://mylocaluri.com"); 
var myClient = new MyClient<StatisticalProgram>(uri, "StatisticalPrograms"); 
var result = myClient.Entities().ToList(); 

Я использую

using System.Web.OData.Builder; 
using Microsoft.OData.Client; 
using Microsoft.OData.Edm; 

Таким образом, чтобы подвести итоги. Он отлично работает, если я использую odata.org, но не мой локальный источник OData. Я полагаю, что это может быть связано с ID -property, так как это guid. Может ли это испортить картографирование? Местный источник OData отлично работает, если вы используете его только с Postman или браузером. Таким образом, есть проблемы с отображением.

ответ

1

Оказалось, что я использовал неправильный атрибут для определения Id -колона.

Оно должно быть:

[global::Microsoft.OData.Client.Key("Id")] 

Так что теперь моя модель выглядит, как это и все работает отлично!

[Microsoft.OData.Client.Key("Id")] 
public class StatisticalProgram 
{ 
    public string Name { get; set; } 
    public Guid Id { get; set; } 
    public string ShortName { get; set; } 
}