我使用带有实体框架和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请求
我错过了什么或做错了什么?
答案 0 :(得分:2)
您使用的是哪个版本?
据我所知,最新的5.x和6.x版本支持多个密钥,无论您使用的是属性路由还是约定路由。
中的评论因此,对于您的场景,如果在约定路由中,控制器方法中的参数名称应以&#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
让我知道这是否对您有帮助。 祝你好运,编码很棒!