Obtener entidades relacionadas ASP.NET WebApi OData v4 da como resultado "No se encontró ningún recurso HTTP que coincida con el URI de la solicitud"

Seguíeste tutorial de asp.net por Mike Wasson, y logré configurar las entidades relacionadas muy bien, pero cuando apliqué esta lógica a mi proyecto, las relaciones de entidades más complejas (en el sentido de que hay más de ellas; esa es la única diferencia) no tuvieron éxito en una llamada OData, yo obtuve un 404 con esta carga útil:

{
  "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": ""
    }
  }
}

El tutorial no menciona la necesidad de configurar las navegaciones de EdmModel y Mike Wasson señala que "asp.net es documentación oficial :-)"; Por lo tanto, he pasado un tiempo tratando de hacer que estas entidades relacionadas funcionen, pensando que había configurado el proyecto incorrectamente.

Pensé que podría tener algo que ver con la versión de las bibliotecas ASP.NET OData que NuGet estaba instalando (la consola NuGet instala 6.9.x, mientras que NuGet Dialog instala 6.5.x). También me preguntaba si era porque configuré el proyecto como un proyecto completamente vacío y luego uso OWIN, así que lo probé con una solución de plantilla ASP.NET pura. También probé un par de otras posibles soluciones: OData-route-atributos en mis métodos de controlador; e incluir mi capa de datos y mis modelos en la misma biblioteca (los separé para mantener SECO); Incluso intenté usarel depurador de rutas WebApi por Rick Anderson - ¡No intentaría usar esto de nuevo!

Todo fue en vano.

Hubo un breve momento en que funcionaron, pero no sé por qué; dejaron de trabajar en la próxima compilación / ejecución; supongo que cambié algo en el medio, pero fue muy leve y estaba perdiendo confianza en cada paso.

Entonces decidí que Mike Wasson debía haber tomado el camino de menor resistencia en su tutorial y volví aesta SO pregunta / respuesta y lo modificó para usarlo con ODataConventionModelBuilder y reutilizarlo, como explicaré en mi respuesta a continuación.

Si alguien sabe de una manera más simple de hacer que esto funcione, hágamelo saber, de lo contrario, recomiendo simplemente morder la viñeta y escribir esas EdmModel-Navigations en mi respuesta a continuación.

Respuestas a la pregunta(2)

Su respuesta a la pregunta