WebApi OData 4,第二个POST端点,用于在控制器中批量插入

时间:2016-02-19 15:03:09

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

我有一个用于TEAM模型的基本WebApi OData 4控制器,它具有用于向数据库添加新TEAM的POST操作。

    public async Task<IHttpActionResult> Post(USER_TEAMS userTeam)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        context.USER_TEAMS.Add(userTeam);
        await context.SaveChangesAsync();
        return Created(userTeam);
    }

我希望在该控制器中有另一个端点,用于团队的批量插入,它会获取团队对象列表并将它们添加到数据库中。 WebApi OData 4中最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

OData规范包含batching概念,但对于此问题,OData action是一个更清洁的解决方案。该操作将绑定到Teams实体集,并将接受请求有效内容中的Team个实体的集合。 (我在下面的代码中将USER_TEAMS更改为Team。)

给出Team实体类型的以下简单定义:

public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
}

首先,在与Post方法相同的控制器中定义操作方法。

    [HttpPost]
    public IHttpActionResult BulkAdd(ODataActionParameters parameters)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest();
        }

        var newTeams = (IEnumerable<Team>)parameters["NewTeams"];

        // Your data access layer logic goes here.

        return this.StatusCode(HttpStatusCode.NoContent);
    }

然后在Web API配置代码中声明OData操作。

    var builder = new ODataConventionModelBuilder();

    builder.Namespace = "TeamService";
    builder.EntitySet<Team>("Teams");
    builder.EntityType<Team>().Collection
        .Action("BulkAdd")
        .CollectionParameter<Team>("NewTeams");

请注意以上内容:

  • EntityTypeConfiguration<T>.Collection必须将操作绑定到Team实体集(相对于单个Team实体)
  • ActionConfiguration.CollectionParameter<T>是指定参数是集合(与标量相比)
  • 的必要条件

在客户端上,按如下方式调用操作。

POST http://domain/Teams/TeamService.BulkAdd
Content-Type: application/json

{"NewTeams": [{"Name": "Demons"}, {"Name": "Angels"}]}