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