带复合键的Odata v3 Web Api导航

Edu*_*rdo 6 asp.net composite-key odata asp.net-web-api

我有一个使用Odata v3的Web Api,其中一些实体是复合键,如下所示:

public class AerodromoAdministracaoData
{
    [Key]
    [Column("idAerodromo", Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public short IdAerodromo { get; set; }

    [Key]
    [Column("data", Order = 1, TypeName = "date")]
    public DateTime Data { get; set; }       

    public virtual Aerodromo Aerodromo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我按照这篇msdn文章创建了一个NavigationRoutingConvention.应用程序现在处理复合键.但是,像这样的导航链接不起作用:

http://localhost/WebApiV3/AerodromoAdministracaoData%28idAerodromo=1,data=%272014-10-24%27%29/Aerodromo
Run Code Online (Sandbox Code Playgroud)

我一直收到"没有找到与请求匹配的HTTP资源",好像该方法没有在控制器中实现.顺便说一句,这是控制器方法:

    [EnableQuery]
    public Aerodromo GetAerodromo([FromODataUri] short idAerodromo, [FromODataUri] DateTime data)
    {
        AerodromoAdministracaoData result = Store.AerodromoAdministracaoData.Find(idAerodromo, data);
        if (result == null)
        {
            throw new HttpResponseException(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NotFound));
        }
        return result.Aerodromo;
    }
Run Code Online (Sandbox Code Playgroud)

发现这个问题谈的是完全相同的问题,但我还没弄明白尼康如何处理这个问题.

Sam*_* Xu 2

爱德华多

来自 MSDN 文章在 ASP.NET Web API OData 中支持复合键

public class CompositeKeyRoutingConvention : EntityRoutingConvention
{
   ....
}
Run Code Online (Sandbox Code Playgroud)

上述路由约定可以涵盖以下Uri模板:

  • 〜/实体集/键
  • 〜/实体集/键/演员

但是,它不能覆盖~/entityset/key/navigation

修复很简单,只需从NavigationRouteConvention下面导出

public class CompositeKeyRoutingConvention : NavigationRoutingConvention
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

下面是调试信息: 调试信息:

请确保:如果您想支持两个 Uris:

  • /AerodromoAdministracaoData%28idAerodromo=1,数据=%272014-10-24%27%29
  • /AerodromoAdministracaoData%28idAerodromo=1,data=%272014-10-24%27%29/Aerodromo

您必须有两种自定义路由约定,一种源自EntityRoutingConvention,另一种源自NavigationRoutingConvention

希望它能有所帮助。谢谢。