Simple.OData.Client - 无法调用接受实体集合参数

时间:2015-06-15 08:16:18

标签: odata asp.net-web-api2 simple.odata

  

我收到错误"参数' wheel'是Edm类型' Collection'。   您不能在不属于的参数上调用CreateCollectionWriter   Edm类型' Collection'。"

以下是我的设置详情:

Web API 2.2 OData v4服务:我在我的服务中定义了WheelsController类中的Action,如下所示:

public async Task<IHttpActionResult> UpdateWheels(ODataActionParameters   parameters)
{
object value;
parameters.TryGetValue("carId", out value);
int carId= (int)value;
parameters.TryGetValue("wheels", out value)
IEnumerable<Wheel> wheels = (IEnumerable<Wheel>)value;
// logic goes here....
return OK();
}

在WebApiConfig.cs文件中,Action配置定义如下:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Car>("Cars");
builder.EntitySet<Wheel>("Wheels");
var action = builder.EntityType<Wheel>().Collection.Action("UpdateWheels");
action.Parameter<int>("carId");
action.CollectionParameter<Wheel>("wheels");

我成功地从FireFox浏览器中的RESTClient扩展中调用上述操作作为对URL&#34; http://localhost/Service/Wheels/UpdateWheels&#34;的POST请求请求正文为

{"carId":2,
"wheels":[{"Id":1,"Name":"Wheel Front 1","Description":"Front wheel left",   "PositionEnum":"FrontLeft"},
{"Id":2,"Name":"Wheel Front 2","Description":"Front wheel right",   "PositionEnum":"FrontRight"}]
}

但是,当我尝试在客户端应用程序中使用Simple.OData.Client调用上述服务操作时,它会出现错误,例如

public async void TestUpdateWheels(List<Wheel> wheelList)
{
// client is derived from ODataClient from assembly Simple.OData.Client.Core.dll, v4.3.0.0
await client.For<Wheel>()
.Action("UpdateWheels")
.Set(new { carId = 2, wheels = wheelList})
.ExecuteAsync();
}
  

错误讯息:参数&#39; wheel&#39;是Edm类的   &#39;收集&#39 ;.您不能在参数上调用CreateCollectionWriter   这不是Edm类型&#39; Collection&#39;。

如何从ODataClient成功调用上述操作?

2 个答案:

答案 0 :(得分:1)

当我向项目网站报告时,这是Simple.OData.Client版本4.3.0中的一个错误。有关详细信息,请访问链接https://github.com/object/Simple.OData.Client/issues/117

  

Simple.OData.Client的新bug修复版本4.7.2修复了   问题对我来说!

答案 1 :(得分:0)

以这种方式试试。它在我的一个项目中适合我。

public async Task<string> TestUpdateWheels(List<Wheel> wheelList)
{
    string getRules = await client.ExecuteActionAsScalarAsync<string>
     ("UpdateWheels", new Dictionary<string, object>
        {
           { "YourParamater", wheelList}

        });
   return getRules ;
}