2013-05-09 4 views
4

Если посмотреть на следующее OData образцов корма вы увидите включены свойства навигации для элементов «ребенок», чтобы сказать вам, какие URL следовать:Почему мой ответ OData имеет навигационные свойства

http://services.odata.org/OData/OData.svc/Suppliers?$format=json

Например, поставщик 0 имеет свойство навигации к продукции. Это ссылки на список продуктов, предназначенных для этого поставщика.

http://services.odata.org/OData/OData.svc/Suppliers(0)/Products?$format=json


Я пытаюсь сделать то же самое с ODataConventionModelBuilder и EntitySetController<Product>, так что, когда я прошу oData/Product(0) будет показать мне 'функции' для продукта:

Я создаю свою модель следующим образом (на основе GetImplicitEdmModel sample)

 // odata 
    ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
    modelBuilder.EntitySet<RRStoreDB.Models.Product>("Product"); 
    modelBuilder.EntitySet<RRStoreDB.Models.ProductFeature>("ProductFeature"); 

    Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel(); 
    config.Routes.MapODataRoute("ODataRoute", "odata", model); 

создать контроллер для WebAPI:

public class ProductController : EntitySetController<Product, int> 
{ 
    RRStoreDBContext _db = new RRStoreDBContext(); 


    [Queryable] 
    public override IQueryable<DProduct> Get() 
    { 
     return _db.Products.AsQueryable(); 
    } 

    public ICollection<ProductFeature> GetProductFeatures(int key) 
    { 
     Product product = _db.Products.FirstOrDefault(p => p.ProductId == key); 
     if (product == null) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
     return product.ProductFeatures; 
    } 
} 

Когда я на самом деле вызова URL для моего ребенка собственности он работает и дает мне правильный список функций:

/oData/Products(18)/ProductFeatures 

Однако я ожидал бы свойство навигации в /oData/Products(18), указывая на это.

Что мне нужно сделать, чтобы это появилось. This article говорит, что это автоматически, но я не вижу их:

ODataConventionModelBuilder, который, как правило, рекомендуется более в ODataModelBuilder, будет автоматически выводить уделом иерархий при отсутствии явной конфигурации. Затем, как только будет выведена иерархия , она также выведет свойства и навигацию . Это позволяет вам писать меньше кода, фокусируясь на том, где вы отклоняетесь от наших соглашений.

+0

Я нашел образец, который делает в основном то, что я делаю, - и он тоже не имеет свойств навигации - как я могу их включить - или это не поддерживается? http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ODataServiceSample/ODataService/Controllers/ProductsController.cs –

+0

Я думаю, что я официально отказываюсь от этого уже. oДата слишком сложна! –

+0

Привет @Simon_Weaver, я сделал то же самое, что и вы, но ошибка, которую я получаю: «Не реализована, эта служба не поддерживает запросы OData в форме« ~/entityset/key/unresolved ».« Вы могли бы решить проблему? – ridermansb

ответ

14

Я думаю, проблема в том, что вы просите application/json. application/json в вебе-API OData указует на JSon свет, который является последним представлением OData JSON, направленное на уменьшении размеров полезной нагрузки ответа и обрезков сними необходимые/избыточные метаданные ответа. Для сравнения попробуйте получить URL-адрес ~/oData/Products(18) с принятым заголовком application/json;odata=verbose.

Теперь идея json light заключается в том, что если связь может быть рассчитана, потому что ссылка соответствует соглашениям, она не будет помещена в ответ. Примером этого является навигационная ссылка /oData/Products(18)/ProductFeatures. Это следует за соглашениями OData uri.

OData свет имеет JSON 3 режима, minimalmetadata (по умолчанию), fullmetadata и nometadata. Имена сами объясняют. Если вы хотите, чтобы ссылка будет на проводе, отправьте запрос с заголовком принять application/json;odata=fullmetadata.

Обратитесь к этому document, чтобы узнать больше о json light.

+0

большой - это сделал! есть ли способ заставить полный JSON при вызове из браузера, где сложнее установить заголовки accept –

+0

Вместо '$ format = json' в URL-адресе, попробуйте' $ format = application/json; odata = fullmetadata'. Если вы используете OData из javascript, вас может заинтересовать библиотека [datajs] (http://datajs.codeplex.com/). Насколько мне известно, datajs запрашивает полные метаданные под капотом, но он абстрагирует некоторые из этих деталей для вас. –

+1

web API OData не поддерживает формат $ format из коробки. Очень просто добавить поддержку формата $, используя обработчик сообщений. У меня есть образец [здесь] (https://gist.github.com/raghuramn/5556691) –

Смежные вопросы