У меня есть проект веб-API OData v3. Он использует модель Entity Framework Code First.
Основной класс - Купон. У него есть список. На самом деле это двухэлементная коллекция подтипов ItemRequirement и BasketRequirement. Я хочу сказать:
../odata/Coupons(5)/ItemRequirement
Я НЕ могу заставить это работать.
Во-первых, в классе EF я добавил ItemRequirement как свойство [NotMapped] (поскольку класс уже имеет коллекцию базового класса в качестве свойства навигации, а добавление двух других в качестве свойств просто сгенерирует посторонние ключи таблицы и испортит базы данных без надобности. Иерархия таблиц в Code First отлично работает как есть).
ODataConventionModelBuilder () не принимает ItemRequirement в качестве свойства навигации
Я попытался добавить это:
// GET odata/Coupons(5)/ItemRequirement
public ItemRequirement GetItemRequirement( [FromODataUri] decimal key)
{
return db.Coupons.Where(m => m.CouponId == key).SelectMany(m => m.RedemptionPurchaseRequirements).OfType<ItemRequirement>().FirstOrDefault();
}
URI НИКОГДА не попадет в этот код. Я обнаружил, добавив разработчика IODataRoutingConvention, что ODataPath настроен на навигацию / ключ / неразрешенный.
Я посмотрел на это решение, и оно мне тоже не помогло:
Я не знаю, заключается ли проблема в наследовании, в том, что свойство не отображается в EF, или в чем-то еще.
Я также обнаружил, что это не удается с 404:
oData/PurchaseRequirementsBases(5)/myNamespace.ItemRequirement
Какое колдовство необходимо для абстрагирования коллекции, чтобы потребитель OData мог видеть ItemRequirement как допустимое свойство Coupon?