Odata Controller不使用多个密钥

时间:2017-08-31 05:48:28

标签: c# asp.net asp.net-web-api odata swagger

我使用带有实体框架和odataV4控制器的ASP.NET webapi

首先,我的模型中有一个[Key]标签,并且每个controllerAction都显示在swagger UI中

现在我的模型中有3个[Key]标签,并且只有没有参数的controllerActions显示在swagger UI中

我改变了我的模型

    //Some other stuff
    [Key]
    public byte first{ get; set; }
    public int second{ get; set; }
    public long third{ get; set; }
    //Some other stuff

      //Some other stuff
    [Key]
    public byte first{ get; set; }
    [Key]
    public int second{ get; set; }
    [Key]
    public long third{ get; set; }
    //Some other stuff

和来自

的controllerAction

public async Task<IHttpActionResult> Put([FromODataUri] byte key, Delta<lists> patch)

public async Task<IHttpActionResult> Put([FromODataUri] byte first, [FromODataUri] int second, [FromODataUri] long third, Delta<lists> patch)

使用一个键,端点显示在swagger UI中并且它们可以工作,使用多个键,端点不会显示在swagger UI中,每当我尝试到达端点时,此错误都会显示

  

“在与请求匹配的控制器'列表'上找不到任何操作。”

我在网址

中发送了.../myController(first=1,second=1,third=10)的PUT请求

我错过了什么或做错了什么?

2 个答案:

答案 0 :(得分:2)

您使用的是哪个版本?

据我所知,最新的5.x6.x版本支持多个密钥,无论您使用的是属性路由还是约定路由。

请参阅https://github.com/OData/WebApi/blob/maintenance-V4/src/System.Web.OData/OData/Routing/Conventions/ProcedureRoutingConventionHelpers.cs#L133-L137

中的评论

因此,对于您的场景,如果在约定路由中,控制器方法中的参数名称应以&#34; key&#34;为前缀。

public async Task<IHttpActionResult> Put([FromODataUri] byte keyfirst, [FromODataUri] int keysecond, [FromODataUri] long keythird, Delta<lists> patch)

希望它可以帮到你。 谢谢!

答案 1 :(得分:2)

我解决了它,创建了一个新的EMD类,如下所示:

namespace ODataService.Edm
{
    public static class SampleModelBuilder
    {
        public static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntityType<EntityTableName>().HasKey(c => new { c.first, c.second, c.third});
            builder.EntitySet<EntityTableName>("EntityTableName");
            return builder.GetEdmModel();
        }
    }
}

然后我补充WebApiConfig.cs中的MapODataServiceRoute来调用我的EdmModel:

config.MapODataServiceRoute("ODataRoute", null, Edm.SampleModelBuilder.GetEdmModel());

您可以在此处参考有关自动EDM的更多信息: https://docs.microsoft.com/en-us/odata/odatalib/edm/build-basic-model

最后,我在控制器上使用一些属性路由,如下所示:

[EnableQuery]
[ODataRoute("EntityTableName({first},{second},{third})")]
public SingleResult<EntityTableName> Get([FromODataUri] byte first, [FromODataUri] int second, [FromODataUri] long third)
{
    IQueryable<EntityTableName> result = dbContext.EntityTableName.Where(p => p.first == first && p.second == second && p.third == third);
    return SingleResult.Create(result);
}

要扩展有关属性路由的信息,请检查以下链接: https://docs.microsoft.com/es-es/odata/webapi/attribute-routing

让我知道这是否对您有帮助。 祝你好运,编码很棒!