Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
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.
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.
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
OrdersContextabgeleitete 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ürProductInstanzen. Sie verwendet dieOrdersContextKlasse, um mit Entity Framework zu kommunizieren. - Eine neue Datenbankverbindungszeichenfolge in der Web.config Datei.
Ö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}]