在实体集上执行 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);
}