Udostępnij za pośrednictwem


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.

Zrzut ekranu przedstawiający menu kontrolerów Eksploratora rozwiązań. Opcja dodawania jest zaznaczona, a kontroler jest wyróżniony.

W oknie dialogowym Dodawanie kontrolera nadaj kontrolerowi AdminControllernazwę . 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".

Zrzut ekranu przedstawiający okno dialogowe Dodawanie kontrolera. Menu klasy kontekstowej danych jest otwarte i wyróżniono 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.OrdersContextdanych nazwę .

Zrzut ekranu przedstawiający okno dialogowe nowego kontekstu danych. Pole tekstowe zawiera nazwę nowego kontekstu danych wpisanego w.

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 na Product wystąpieniach. Używa klasy do komunikowania OrdersContext się z programem Entity Framework.
  • Nowe parametry połączenia bazy danych w pliku Web.config.

Zrzut ekranu przedstawiający widok projektu Eksplorator rozwiązań. AdminController dot c s i OrdersContext dot c s są wyróżnione.

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}]