2013-07-23 3 views
0

Я работаю над созданием службы OData на основе WebAPI, и у меня возникают проблемы с ссылками на навигацию. В основном у меня есть два класса, где есть ссылка на другую. Когда я запрашиваю атом или многословный JSON, я вижу, что у меня есть связь между ними. Тем не менее, я хотел бы настроить uri, чтобы он указывал на другое место, а не по умолчанию, принятое библиотекой OData.WebAPI OData и настройка ссылок навигации

Используя простой пример, предположим, что у меня есть два набора объектов, называемых «сущность1» и «сущность2». Они отображаются как службы OData, расположенные по адресу:/api/entities1 и/api/entities2 соответственно.

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

public class Entity1 { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual Entity2 OtherEntity { get; set; } 
} 

public class Entity2 { 
    public int ID { get; set; } 
    public string Value { get; set; } 
} 

Я использую ODataConventionModelBuilder зарегистрировать их следующим образом:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
builder.EntitySet<Entity1>("entities1"); 
builder.EntitySet<Entity2>("entities2"); 
IEdmModel model = builder.GetEdmModel(); 
config.Routes.MapODataRoute(routeName: "OData", routePrefix: "api", model: model); 

Я реализовал контроллер как EntitySetController. Все это работает, как ожидалось, и я получаю следующий ответ, когда я прошу многословный JSON:

{ 
    "d": { 
    "results": [{ 
     "__metadata": { 
     "id": "http://localhost:37826/api/entities1(1)", 
     "uri": "http://localhost:37826/api/entities1(1)", 
     "type": "ODataSample.Models.Entity1" 
     }, 
    "OtherEntity": { 
     "__deferred": { 
      "uri": "http://localhost:37826/api/entities1(1)/OtherEntity" 
     } 
     }, 
     "ID": 1, 
     "Name": "First Entity" 
    }] 
    } 
} 

То, что я хотел бы сделать, это есть поле «OtherEntity» в экземпляре entity1 относятся к экземпляру ассоциированных entity2 под/api/entities2, чтобы ссылка отображалась как/api/entities2 (2) (при условии, что идентификатор экземпляра Entity2 равен «2»).

Я знаю, что могу просто сделать тип «OtherEntity» Uri и вставить соответствующее значение в свой контроллер, но это кажется немного взломанным (но я могу ошибаться). Из того, что понимают в OData, я считаю, что правильный способ сделать это - изменить свойство навигации, но я не уверен, как и где.

Любая помощь приветствуется. Заранее спасибо.

Приветствия, Стив

ответ

2

Вы могли бы сделать что-то вроде следующего:

 var entities1 = builder.EntitySet<Entity1>("Entities1"); 
     entities1.HasNavigationPropertyLink(entities1.EntityType.NavigationProperties.First(np => np.Name == "OtherEntity"), 
      (context, navigation) => 
      { 
       return new Uri(context.Url.ODataLink(new EntitySetPathSegment("Entities2"), new KeyValuePathSegment(context.EntityInstance.OtherEntity.Id.ToString()))); 
      }, followsConventions: false); 
+0

Это работает как шарм, спасибо за помощь. В качестве бонуса, я теперь вижу ссылку в световом выходе JSON (что, я полагаю, связано с выражением «followConventions: false»). – SteveSE

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