我有一个用于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中最好的方法是什么?
答案 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"}]}