Службы данных WCF (OData) - расширяют свойства навигации с помощью внешнего ключа
В настоящее время я пишу службу OData, основанную на наборе инструментов WCF Dataservices.
Служба предоставляет несколько объектов, пример которых приведен ниже.
public class Entitlement : IEntity
{
#region Implementation of IEntity
public string Id { get; set; }
#endregion
public string ItemId { get; set; }
[ForeignProperty]
public Item Item { get; set; }
}
public class Item : IEntity
{
#region Implementation of IEntity
public string Id { get; set; }
#endregion
public string ItemName { get; set; }
}
Из-за того, что данные извлекаются из 2 отдельных источников данных, я хочу сохранить только идентификатор элемента в объекте "Право", а не весь объект "элемент".
Это работает для запросов, таких как: Entitlement('1')/Item, служба понимает, что ей нужно использовать ItemId для выполнения поиска.
Однако проблема возникает, когда я пытаюсь развернуть элемент, используя приведенное ниже право доступа к URL-адресу ('1')?$ Expand=Item
Элемент всегда возвращается как ноль, я понимаю, что это потому, что я не храню Элемент на объекте прав, но есть ли способ заставить OData обрабатывать оператор расширения так же, как он обрабатывает проекцию?
Я пробовал Entitlement('1')?$ Select=Item, но это также возвращается как ноль.
Любые предложения будут ценны.
2 ответа
Чтобы иметь возможность использовать $expand, в вашем связанном свойстве должно быть виртуальное ключевое слово
public class Entitlement : IEntity
{
#region Implementation of IEntity
public string Id { get; set; }
#endregion
public string ItemId { get; set; }
public virtual Item Item { get; set; }
}
Это позволит вам использовать опцию запроса oData $expand
Правах ('1')?$ = Расширение товара
Для расширения объектов, на которые ссылается свойство навигации (коллекция), я думаю, что вам нужно использовать синтаксис $links в URI.
См. Раздел 3.2"Адресация связей между объектами" в документе "Соглашения URI протокола OData", док.