2016-02-19 15 views
2

我有一个TEAM模型的基本WebApi OData 4控制器,它有一个POST操作,用于向数据库添加一个新的TEAM。WebApi OData 4,在控制器中批量插入的第二个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

OData规范包含batching概念,但对于此问题,OData action是更清晰的解决方案。该动作将被绑定到团队实体集合,并将接受请求有效负载中的Team实体的集合。 (我在下面的代码改变USER_TEAMSTeam。)

鉴于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"}]} 
+0

感谢您的明确回答! – Ehsan

相关问题