Я работаю над созданием службы 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, я считаю, что правильный способ сделать это - изменить свойство навигации, но я не уверен, как и где.
Любая помощь приветствуется. Заранее спасибо.
Приветствия, Стив
Это работает как шарм, спасибо за помощь. В качестве бонуса, я теперь вижу ссылку в световом выходе JSON (что, я полагаю, связано с выражением «followConventions: false»). – SteveSE