Teil 3: Erstellen eines Admin-Controllers

von Rick Anderson

Abgeschlossenes Projekt herunterladen

Hinzufügen eines Admin-Controllers

In diesem Abschnitt fügen wir einen Web-API-Controller hinzu, der CRUD-Vorgänge (Erstellen, Lesen, Aktualisieren und Löschen) für Produkte unterstützt. Der Controller verwendet Entity Framework für die Kommunikation mit der Datenbankebene. Nur Administratoren können diesen Controller verwenden. Kunden greifen über einen anderen Controller auf die Produkte zu.

Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner „Controller“. Wählen Sie Hinzufügen und dann Controller aus.

Screenshot des Menüs

Geben Sie dem Controller AdminControllerim Dialogfeld Controller hinzufügen den Namen . Wählen Sie unter Vorlage die Option "API-Controller mit Lese-/Schreibaktionen mithilfe von Entity Framework" aus. Wählen Sie unter Model-Klasse die Option "Product (ProductStore.Models)" aus. Wählen Sie unter Datenkontext die Option "<Neuer Datenkontext>" aus.

Screenshot des Dialogfelds

Hinweis

Wenn in der Dropdownliste Modellklasse keine Modellklassen angezeigt werden, stellen Sie sicher, dass Sie das Projekt kompiliert haben. Entity Framework verwendet Reflektion, sodass die kompilierte Assembly benötigt wird.

Wenn Sie "<Neuer Datenkontext>" auswählen, wird das Dialogfeld Neuer Datenkontext geöffnet. Nennen Sie den Datenkontext ProductStore.Models.OrdersContext.

Screenshot des Dialogfelds

Klicken Sie auf OK , um das Dialogfeld Neuer Datenkontext zu schließen. Klicken Sie im Dialogfeld Controller hinzufügen auf Hinzufügen.

Folgendes wurde dem Projekt hinzugefügt:

  • Eine Klasse namens OrdersContext , die von DbContext abgeleitet wird. Diese Klasse stellt den Klebstoff zwischen den POCO-Modellen und der Datenbank bereit.
  • Ein Web-API-Controller mit dem Namen AdminController. Dieser Controller unterstützt CRUD-Vorgänge für Product Instanzen. Es verwendet die -Klasse für die OrdersContext Kommunikation mit Entity Framework.
  • Eine neue Datenbankverbindungszeichenfolge in der Web.config-Datei.

Screenshot der Projektansicht

Öffnen Sie die Datei OrdersContext.cs. Beachten Sie, dass der Konstruktor den Namen der Datenbankverbindungszeichenfolge angibt. Dieser Name bezieht sich auf die Verbindungszeichenfolge, die Web.config hinzugefügt wurde.

public OrdersContext() : base("name=OrdersContext")

Fügen Sie der Klasse OrdersContext die folgenden Eigenschaften hinzu:

public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }

Ein DbSet stellt eine Gruppe von Entitäten dar, die abgefragt werden können. Hier ist die vollständige Auflistung für die OrdersContext -Klasse:

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

Die AdminController -Klasse definiert fünf Methoden, die grundlegende CRUD-Funktionen implementieren. Jede Methode entspricht einem URI, den der Client aufrufen kann:

Controller-Methode Beschreibung URI HTTP-Methode
GetProducts Ruft alle Produkte ab. api/products GET
GetProduct Sucht ein Produkt nach ID. api/products/id GET
PutProduct Updates ein Produkt. api/products/id PUT
PostProduct Erstellt ein neues Produkt. api/products POST
DeleteProduct Löscht ein Produkt. api/products/id Delete

Jede Methode ruft in OrdersContext auf, um die Datenbank abzufragen. Die Methoden, die den Auflistungsaufruf db.SaveChanges (PUT, POST und DELETE) ändern, um die Änderungen an der Datenbank beizubehalten. Controller werden pro HTTP-Anforderung erstellt und dann verworfen, sodass Änderungen beibehalten werden müssen, bevor eine Methode zurückgegeben wird.

Hinzufügen eines Datenbankinitialisierers

Entity Framework verfügt über ein nützliches Feature, mit dem Sie die Datenbank beim Start auffüllen und die Datenbank automatisch neu erstellen können, wenn sich die Modelle ändern. Dieses Feature ist während der Entwicklung nützlich, da Sie immer über einige Testdaten verfügen, auch wenn Sie die Modelle ändern.

Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Models, und erstellen Sie eine neue Klasse mit dem Namen OrdersContextInitializer. Verwenden Sie die folgenden Implementierung:

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();
        }
    }
}

Indem wir von der DropCreateDatabaseIfModelChanges-Klasse erben , weisen wir Entity Framework an, die Datenbank zu löschen, wenn wir die Modellklassen ändern. Wenn Entity Framework die Datenbank erstellt (oder neu erstellt), ruft es die Seed-Methode auf, um die Tabellen aufzufüllen. Wir verwenden die Seed-Methode , um einige Beispielprodukte und eine Beispielreihenfolge hinzuzufügen.

Dieses Feature eignet sich hervorragend zum Testen, aber verwenden Sie nicht die DropCreateDatabaseIfModelChanges-Klasse in der Produktion, da Sie Ihre Daten verlieren könnten, wenn jemand eine Modellklasse ändert.

Öffnen Sie als Nächstes Global.asax, und fügen Sie der Application_Start-Methode den folgenden Code hinzu:

System.Data.Entity.Database.SetInitializer(
    new ProductStore.Models.OrdersContextInitializer());

Senden einer Anforderung an den Controller

Zu diesem Zeitpunkt haben wir keinen Clientcode geschrieben, aber Sie können die Web-API mithilfe eines Webbrowsers oder eines HTTP-Debugtools wie Fiddler aufrufen. Drücken Sie in Visual Studio F5, um das Debuggen zu starten. Ihr Webbrowser wird geöffnet, http://localhost:*portnum*/wobei portnum eine Portnummer ist.

Senden Sie eine HTTP-Anforderung an "http://localhost:*portnum*/api/admin. Die erste Anforderung kann langsam abgeschlossen werden, da Entity Framework die Datenbank erstellen und seeden muss. Die Antwort sollte in etwa wie folgt aussehen:

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