我有一个使用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如何处理这个问题。
答案 0 :(得分:2)
爱德华
来自MSDN文章Support Composite Key in ASP.NET Web API OData
public class CompositeKeyRoutingConvention : EntityRoutingConvention
{
....
}
上述路由约定可以涵盖以下Uri模板:
但是,它无法涵盖〜/ entityset / key / navigation
修复很简单,只是来自NavigationRouteConvention
,如下所示
public class CompositeKeyRoutingConvention : NavigationRoutingConvention
{
...
}
以下是调试信息:
请确保:如果你想要支持Uris:
您必须拥有两个自定义路由约定,一个来自EntityRoutingConvention
,另一个来自NavigationRoutingConvention
。
希望它可以提供帮助。感谢。