在实体集上执行 CRUD
查询实体集
将以下方法添加到 ProductsController 。
[EnableQuery]
public IQueryable<Product> Get()
{
return db.Products;
}
[EnableQuery]
public SingleResult<Product> Get([FromODataUri] int key)
{
IQueryable<Product> result = db.Products.Where(p => p.Id == key);
return SingleResult.Create(result);
}
Get 方法的无参数版本返回整个 Products 集合。带有 key 参数的 Get 方法按其键查找产品(在本例中为 Id 属性)。
在 [EnableQuery] 属性让客户修改查询,通过查询选项,如$过滤,排序$和$页。有关更多信息,请参阅支持 OData 查询选项 。
将实体添加到实体集
要使客户端能够将新产品添加到数据库,请将以下方法添加到 ProductsController 。
public async Task<IHttpActionResult> Post(Product product)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Products.Add(product);
await db.SaveChangesAsync();
return Created(product);
}
更新实体
OData 支持两种不同的语义来更新实体 PATCH 和 PUT。
- PATCH 执行部分更新。客户端仅指定要更新的属性。
- PUT 取代整个实体。
PUT 的缺点是客户端必须为实体中的所有属性发送值,包括不更改的值。该 OData 的规范指出,补丁是首选。
无论如何,这里是 PATCH 和 PUT 方法的代码:
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Product> product)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var entity = await db.Products.FindAsync(key);
if (entity == null)
{
return NotFound();
}
product.Patch(entity);
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ProductExists(key))
{
return NotFound();
}
else
{
throw;
}
}
return Updated(entity);
}
public async Task<IHttpActionResult> Put([FromODataUri] int key, Product update)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (key != update.Id)
{
return BadRequest();
}
db.Entry(update).State = EntityState.Modified;
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ProductExists(key))
{
return NotFound();
}
else
{
throw;
}
}
return Updated(update);
}
在 PATCH 的情况下,控制器使用 Delta <T> 类型来跟踪更改。
删除实体
要使客户端能够从数据库中删除产品,请将以下方法添加到 ProductsController 。
public async Task<IHttpActionResult> Delete([FromODataUri] int key)
{
var product = await db.Products.FindAsync(key);
if (product == null)
{
return NotFound();
}
db.Products.Remove(product);
await db.SaveChangesAsync();
return StatusCode(HttpStatusCode.NoContent);
}