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

WebApi OData 4 , second POST endpoint for bulk insertion in the controller

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

    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 中最好的方法是什么?

OData 规范中包含一个 batching concept, but for this problem an 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"}]}