Freigeben über


Teil 3: Erstellen eines Administratorcontrollers

von Rick Anderson

Abgeschlossenes Projekt herunterladen

Hinzufügen eines Administratorkontrollers

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

Nennen Sie im Dialogfeld " Controller hinzufügen " den Controller AdminController. 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 "Produkt (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 Spiegelung, sodass sie die kompilierte Assembly benötigt.

Wenn Sie "<Neuer Datenkontext>" auswählen, wird das Dialogfeld " Neuer Datenkontext " geöffnet. Geben Sie dem Datenkontext ProductStore.Models.OrdersContexteinen Namen.

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".

Hier sehen Sie, was dem Projekt hinzugefügt wurde:

  • Eine Von OrdersContext abgeleitete Klasse. 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. Sie verwendet die OrdersContext Klasse, um mit Entity Framework zu kommunizieren.
  • Eine neue Datenbankverbindungszeichenfolge in der Web.config Datei.

Screenshot der Projektansicht im Projektmappen-Explorer. AdminController dot c s und OrdersContext dot c s sind hervorgehoben.

Öffnen Sie die OrdersContext.cs Datei. Beachten Sie, dass der Konstruktor den Namen der Datenbankverbindungszeichenfolge angibt. Dieser Name bezieht sich auf die Verbindungszeichenfolge, die zu 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 Reihe 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-Funktionalität implementieren. Jede Methode entspricht einem URI, den der Client aufrufen kann:

Controller-Methode Beschreibung URI (Uniform Resource Identifier) HTTP-Methode
GetProducts Ruft alle Produkte ab. api/products ERHALTEN/Bekommen
GetProduct Sucht ein Produkt anhand der ID. api/products/id ERHALTEN/Bekommen
PutProduct Aktualisiert ein Produkt. api/products/id PUT
PostProduct Erstellt ein neues Produkt. api/products POST
ProduktLöschen Löscht ein Produkt. api/products/id Löschen

Jede Methode ruft zum Abfragen der Datenbank auf OrdersContext . Die Methoden, die die Sammlung ändern (PUT, POST und DELETE), rufen db.SaveChanges auf, um die Änderungen in der Datenbank zu speichern. Controller werden pro HTTP-Anforderung erstellt und dann verworfen, daher müssen Änderungen beibehalten werden, bevor eine Methode zurückgegeben wird.

Hinzufügen eines Datenbankinitialisierungsprogramms

Entity Framework verfügt über ein nettes 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 einige Testdaten haben, auch wenn Sie die Modelle ändern.

Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner "Modelle", und erstellen Sie eine neue Klasse mit dem Namen OrdersContextInitializer. Fügen Sie die folgende Implementierung ein:

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

Durch das Erben von der DropCreateDatabaseIfModelChanges-Klasse wird Entity Framework aufgefordert, die Datenbank immer dann abzulegen, wenn wir die Modellklassen ändern. Wenn Entity Framework die Datenbank erstellt (oder neu erstellt), ruft sie 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

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

Senden Sie eine HTTP-Anforderung an "http://localhost:*portnum*/api/admin. Die erste Anforderung kann langsam abgeschlossen sein, da Entity Framework die Datenbank erstellen und seeden muss. Die Antwort sollte 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}]