带复合键的Odata v3 Web Api导航

时间:2014-11-11 18:17:26

标签: asp.net asp.net-web-api odata composite-key

我有一个使用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; }
}

我跟着this msdn article and created a NavigationRoutingConvention。应用程序现在处理复合键。但是,像这样的导航链接不起作用:

http://localhost/WebApiV3/AerodromoAdministracaoData%28idAerodromo=1,data=%272014-10-24%27%29/Aerodromo

我一直收到“未找到与请求匹配的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;
    }

found this question谈论完全相同的问题,但我还没弄清楚Nikon如何处理这个问题。

1 个答案:

答案 0 :(得分:2)

爱德华

来自MSDN文章Support Composite Key in ASP.NET Web API OData

public class CompositeKeyRoutingConvention : EntityRoutingConvention
{
   ....
}

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

  • 〜/ EntitySet的/键
  • 〜/ EntitySet的/关键码/铸造

但是,它无法涵盖〜/ entityset / key / navigation

修复很简单,只是来自NavigationRouteConvention,如下所示

public class CompositeKeyRoutingConvention : NavigationRoutingConvention
{
    ...
}

以下是调试信息: The debug information:

请确保:如果你想要支持Uris:

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

您必须拥有两个自定义路由约定,一个来自EntityRoutingConvention,另一个来自NavigationRoutingConvention

希望它可以提供帮助。感谢。