При получении связанных сущностей ASP.NET WebApi OData v4 приводит к «Не найден ресурс HTTP, соответствующий URI запроса»

Я последовал заэтот учебник asp.net Майк Уоссони мне удалось настроить связанные сущности просто отлично, но когда я применил эту логику к своему проекту, более сложные отношения сущностей (в том, что их больше; единственное отличие) не преуспели бы в вызове OData, я получил 404 с этой полезной нагрузкой:

{
  "error": {
    "code": "",
    "message": "No HTTP resource was found that matches the request URI 'http://localhost:19215/Menus(c94f7f98-6987-e411-8119-984be10349a2)/MenuPermissions'.",
    "innererror": {
      "message": "No routing convention was found to select an action for the OData path with template '~/entityset/key/unresolved'.",
      "type": "",
      "stacktrace": ""
    }
  }
}

В учебнике не упоминается необходимость настройки навигации EdmModel, и Майк Уоссон подчеркивает, что «asp.net является официальной документацией :-)»; Итак, я потратил некоторое время, пытаясь заставить эти связанные объекты работать, думая, что я настроил проект неправильно.

Я подумал, что это может быть связано с версией библиотек OData ASP.NET, которые устанавливал NuGet (Консоль NuGet устанавливает 6.9.x, тогда как диалог NuGet устанавливает 6.5.x). Я также подумал, что это потому, что я настроил проект как полностью пустой проект, а затем использовал OWIN, поэтому я попробовал его с помощью чистого шаблонного решения ASP.NET. Я также попробовал несколько других возможных решений: атрибуты OData-route на моих методах контроллера; и включая мой слой данных и модели в одной библиотеке (я выделил их, чтобы сохранить СУХОЙ); Я даже пытался использоватьотладчик маршрута WebApi Рика Андерсона - Я бы не стал использовать это снова!

Все безрезультатно.

Был короткий момент, когда они работали, но я не знаю почему; они перестали работать при следующей сборке / запуске - я думаю, что я что-то поменял между ними, но это было очень незначительно, и я терял уверенность на каждом шагу.

Тогда я решил, что Майк Уоссон, должно быть, только что пошел по пути наименьшего сопротивления в своем уроке, и поэтому я вернулся кэтот ТАК вопрос / ответ и изменил его для использования с ODataConventionModelBuilder и повторного использования, как я объясню в моем ответе ниже.

Если кто-нибудь знает о более простом способе заставить это работать, пожалуйста, дайте мне знать, в противном случае я рекомендую просто прикусить пулю и написать эти EdmModel-Navigations в моем ответе ниже.

Ответы на вопрос(2)

Ваш ответ на вопрос