在實體集上執行 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);
}