Część 3. Tworzenie kontrolera Administracja
Autor: Rick Anderson
Pobieranie ukończonego projektu
Dodawanie kontrolera Administracja
W tej sekcji dodamy kontroler internetowego interfejsu API, który obsługuje operacje CRUD (tworzenie, odczytywanie, aktualizowanie i usuwanie) na produktach. Kontroler będzie używać programu Entity Framework do komunikowania się z warstwą bazy danych. Tylko administratorzy będą mogli używać tego kontrolera. Klienci będą uzyskiwać dostęp do produktów za pośrednictwem innego kontrolera.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy folder Controllers. Wybierz pozycję Dodaj , a następnie pozycję Kontroler.
W oknie dialogowym Dodawanie kontrolera nadaj kontrolerowi AdminController
nazwę . W obszarze Szablon wybierz pozycję "Kontroler interfejsu API z akcjami odczytu/zapisu przy użyciu platformy Entity Framework". W obszarze Klasa modelu wybierz pozycję "Product (ProductStore.Models)". W obszarze Kontekst danych wybierz pozycję "<Nowy kontekst> danych".
Uwaga
Jeśli lista rozwijana Klasa modelu nie zawiera żadnych klas modelu, upewnij się, że projekt został skompilowany. Program Entity Framework używa odbicia, więc potrzebuje skompilowanego zestawu.
Wybranie pozycji "<Nowy kontekst danych" spowoduje otwarcie okna dialogowego Nowy kontekst> danych. Nadaj kontekstowi ProductStore.Models.OrdersContext
danych nazwę .
Kliknij przycisk OK , aby zamknąć okno dialogowe Nowy kontekst danych . W oknie dialogowym Dodawanie kontrolera kliknij przycisk Dodaj.
Oto, co dodano do projektu:
- Klasa o nazwie
OrdersContext
pochodząca z dbContext. Ta klasa zapewnia klej między modelami POCO i bazą danych. - Kontroler internetowego interfejsu API o nazwie
AdminController
. Ten kontroler obsługuje operacje CRUD naProduct
wystąpieniach. Używa klasy do komunikowaniaOrdersContext
się z programem Entity Framework. - Nowe parametry połączenia bazy danych w pliku Web.config.
Otwórz plik OrdersContext.cs. Zwróć uwagę, że konstruktor określa nazwę parametrów połączenia bazy danych. Ta nazwa odnosi się do parametrów połączenia dodanych do Web.config.
public OrdersContext() : base("name=OrdersContext")
Dodaj następujące właściwości do OrdersContext
klasy :
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
Zestaw dbSet reprezentuje zestaw jednostek, które mogą być odpytywane. Oto pełna lista dla OrdersContext
klasy:
public class OrdersContext : DbContext
{
public OrdersContext() : base("name=OrdersContext")
{
}
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
public DbSet<Product> Products { get; set; }
}
Klasa AdminController
definiuje pięć metod implementujących podstawową funkcjonalność CRUD. Każda metoda odpowiada identyfikatorowi URI, który klient może wywołać:
Controller, metoda | Opis | URI | HTTP, metoda |
---|---|---|---|
GetProducts | Pobiera wszystkie produkty. | api/products | GET |
GetProduct | Znajduje produkt według identyfikatora. | api/products/id | GET |
PutProduct | Aktualizacje produkt. | api/products/id | PUT |
PostProduct | Tworzy nowy produkt. | api/products | POST |
DeleteProduct (Usuń produkt) | Usuwa produkt. | api/products/id | DELETE |
Każda metoda wywołuje metodę w OrdersContext
celu wykonywania zapytań względem bazy danych. Metody modyfikujące kolekcję (PUT, POST i DELETE) są wywoływane db.SaveChanges
w celu utrwalania zmian w bazie danych. Kontrolery są tworzone na żądanie HTTP, a następnie usuwane, dlatego konieczne jest utrwalanie zmian przed zwróceniem metody.
Dodawanie inicjatora bazy danych
Program Entity Framework oferuje dobrą funkcję, która umożliwia wypełnienie bazy danych podczas uruchamiania i automatyczne ponowne utworzenie bazy danych przy każdej zmianie modeli. Ta funkcja jest przydatna podczas programowania, ponieważ zawsze masz pewne dane testowe, nawet jeśli zmienisz modele.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy folder Models i utwórz nową klasę o nazwie OrdersContextInitializer
. Wklej następującą implementację:
namespace ProductStore.Models
{
using System;
using System.Collections.Generic;
using System.Data.Entity;
public class OrdersContextInitializer : DropCreateDatabaseIfModelChanges<OrdersContext>
{
protected override void Seed(OrdersContext context)
{
var products = new List<Product>()
{
new Product() { Name = "Tomato Soup", Price = 1.39M, ActualCost = .99M },
new Product() { Name = "Hammer", Price = 16.99M, ActualCost = 10 },
new Product() { Name = "Yo yo", Price = 6.99M, ActualCost = 2.05M }
};
products.ForEach(p => context.Products.Add(p));
context.SaveChanges();
var order = new Order() { Customer = "Bob" };
var od = new List<OrderDetail>()
{
new OrderDetail() { Product = products[0], Quantity = 2, Order = order},
new OrderDetail() { Product = products[1], Quantity = 4, Order = order }
};
context.Orders.Add(order);
od.ForEach(o => context.OrderDetails.Add(o));
context.SaveChanges();
}
}
}
Dziedzicząc po klasie DropCreateDatabaseIfModelChanges , informujemy platformę Entity Framework o upuszczaniu bazy danych za każdym razem, gdy modyfikujemy klasy modelu. Gdy program Entity Framework tworzy bazę danych (lub tworzy ją ponownie), wywołuje metodę Seed , aby wypełnić tabele. Używamy metody Seed , aby dodać przykładowe produkty oraz przykładową kolejność.
Ta funkcja doskonale nadaje się do testowania, ale nie używa klasy DropCreateDatabaseIfModelChanges w środowisku produkcyjnym, ponieważ możesz utracić dane, jeśli ktoś zmieni klasę modelu.
Następnie otwórz plik Global.asax i dodaj następujący kod do metody Application_Start :
System.Data.Entity.Database.SetInitializer(
new ProductStore.Models.OrdersContextInitializer());
Wysyłanie żądania do kontrolera
W tym momencie nie napisaliśmy żadnego kodu klienta, ale można wywołać internetowy interfejs API przy użyciu przeglądarki internetowej lub narzędzia debugowania HTTP, takiego jak Fiddler. W programie Visual Studio naciśnij klawisz F5, aby rozpocząć debugowanie. W przeglądarce internetowej zostanie otwarty http://localhost:*portnum*/
adres , gdzie numer portu to jakiś numer portu.
Wyślij żądanie HTTP do adresu "http://localhost:*portnum*/api/admin
. Pierwsze żądanie może być powolne, ponieważ program Entity Framework musi utworzyć i zainicjować bazę danych. Odpowiedź powinna wyglądać podobnie do następującej:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 18 Jun 2012 04:30:33 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 175
Connection: Close
[{"Id":1,"Name":"Tomato Soup","Price":1.39,"ActualCost":0.99},{"Id":2,"Name":"Hammer",
"Price":16.99,"ActualCost":10.00},{"Id":3,"Name":"Yo yo","Price":6.99,"ActualCost":
2.05}]