Here's an example Web API controller that exposes a simple data object through Entity Framework's Code First feature. To support this example, we will need three files:
Listing 11.3: Product.cs
public class Product { public int ID { get; set; } public string Name { get; set; } public decimal Price { get; set; } public int UnitsInStock { get; set; } }
Listing 11.4: DataContext.cs
public class DataContext : DbContext { public DbSet<Product> Products { get; set; } }
Listing 11.5: ProductsController.cs
public class ProductsController : ApiController { private DataContext db = new DataContext(); // GET api/Products public IEnumerable<Product> GetProducts() { return db.Products; } // GET api/Products/5 public Product GetProduct(int id) { Product product = db.Products.Find(id); if (product == null) { throw new HttpResponseException( Request.CreateResponse( HttpStatusCode.NotFound)); } return product; } // PUT api/Products/5 public HttpResponseMessage PutProduct(int id, Product product) { if (ModelState.IsValid && id == product.ID) { db.Entry(product).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { return Request.CreateResponse( HttpStatusCode.NotFound); } return Request.CreateResponse( HttpStatusCode.OK, product); } else { return Request.CreateResponse( HttpStatusCode.BadRequest); } } // POST api/Products public HttpResponseMessage PostProduct(Product product) { if (ModelState.IsValid) { db.Products.Add(product); db.SaveChanges(); HttpResponseMessage response = Request.CreateResponse( HttpStatusCode.Created, product); response.Headers.Location = new Uri(Url.Link( "DefaultApi", new { id = product.ID })); return response; } else { return Request.CreateResponse( HttpStatusCode.BadRequest); } } // DELETE api/Products/5 public HttpResponseMessage DeleteProduct(int id) { Product product = db.Products.Find(id); if (product == null) { return Request.CreateResponse( HttpStatusCode.NotFound); } db.Products.Remove(product); try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { return Request.CreateResponse( HttpStatusCode.NotFound); } return Request.CreateResponse( HttpStatusCode.OK, product); } protected override void Dispose(bool disposing) { db.Dispose(); base.Dispose(disposing); } }