Partie 3 : Création d’un contrôleur Administration
par Rick Anderson
Ajouter un contrôleur Administration
Dans cette section, nous allons ajouter un contrôleur d’API web qui prend en charge les opérations CRUD (créer, lire, mettre à jour et supprimer) sur les produits. Le contrôleur utilisera Entity Framework pour communiquer avec la couche de base de données. Seuls les administrateurs pourront utiliser ce contrôleur. Les clients accèdent aux produits via un autre contrôleur.
Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le dossier Contrôleurs. Sélectionnez Ajouter , puis Contrôleur.
Dans la boîte de dialogue Ajouter un contrôleur , nommez le contrôleur AdminController
. Sous Modèle, sélectionnez « Contrôleur d’API avec des actions de lecture/écriture, à l’aide d’Entity Framework ». Sous Classe de modèle, sélectionnez « Product (ProductStore.Models) ». Sous Contexte de données, sélectionnez «< Nouveau contexte> de données ».
Notes
Si la liste déroulante Classe de modèle n’affiche aucune classe de modèle, vérifiez que vous avez compilé le projet. Entity Framework utilise la réflexion et a donc besoin de l’assembly compilé.
La sélection de «< Nouveau contexte> de données » ouvre la boîte de dialogue Nouveau contexte de données . Nommez le contexte ProductStore.Models.OrdersContext
de données .
Cliquez sur OK pour ignorer la boîte de dialogue Nouveau contexte de données . Dans la boîte de dialogue Ajouter un contrôleur , cliquez sur Ajouter.
Voici ce qui a été ajouté au projet :
- Classe nommée
OrdersContext
qui dérive de DbContext. Cette classe fournit le lien entre les modèles POCO et la base de données. - Un contrôleur d’API web nommé
AdminController
. Ce contrôleur prend en charge les opérations CRUD surProduct
les instances. Il utilise laOrdersContext
classe pour communiquer avec Entity Framework. - Nouvelle chaîne de connexion de base de données dans le fichier Web.config.
Ouvrez le fichier OrdersContext.cs. Notez que le constructeur spécifie le nom de la chaîne de connexion de base de données. Ce nom fait référence à la chaîne de connexion qui a été ajoutée à Web.config.
public OrdersContext() : base("name=OrdersContext")
Ajoutez les propriétés suivantes à la classe OrdersContext
:
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
Un DbSet représente un ensemble d’entités qui peuvent être interrogées. Voici la liste complète de la OrdersContext
classe :
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; }
}
La AdminController
classe définit cinq méthodes qui implémentent des fonctionnalités CRUD de base. Chaque méthode correspond à un URI que le client peut appeler :
Controller, méthode | Description | URI | Méthode HTTP |
---|---|---|---|
GetProducts | Obtient tous les produits. | api/products | GET |
GetProduct | Recherche un produit par ID. | api/products/id | GET |
PutProduct | Mises à jour un produit. | api/products/id | PUT |
PostProduct | Crée un produit. | api/products | POST |
DeleteProduct | Supprime un produit. | api/products/id | Suppression |
Chaque méthode appelle pour OrdersContext
interroger la base de données. Les méthodes qui modifient la collection (PUT, POST et DELETE) appellent db.SaveChanges
pour conserver les modifications apportées à la base de données. Les contrôleurs sont créés par requête HTTP, puis supprimés. Il est donc nécessaire de conserver les modifications avant le retour d’une méthode.
Ajouter un initialiseur de base de données
Entity Framework dispose d’une fonctionnalité intéressante qui vous permet de remplir la base de données au démarrage et de recréer automatiquement la base de données chaque fois que les modèles changent. Cette fonctionnalité est utile pendant le développement, car vous avez toujours des données de test, même si vous modifiez les modèles.
Dans Explorateur de solutions, cliquez avec le bouton droit sur le dossier Models et créez une classe nommée OrdersContextInitializer
. Collez l'implémentation suivante :
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();
}
}
}
En héritant de la classe DropCreateDatabaseIfModelChanges , nous disons à Entity Framework de supprimer la base de données chaque fois que nous modifions les classes de modèle. Quand Entity Framework crée (ou recrée) la base de données, il appelle la méthode Seed pour remplir les tables. Nous utilisons la méthode Seed pour ajouter des exemples de produits et un exemple de commande.
Cette fonctionnalité est idéale pour les tests, mais n’utilisez pas la classe DropCreateDatabaseIfModelChanges en production, car vous risquez de perdre vos données si quelqu’un modifie une classe de modèle.
Ensuite, ouvrez Global.asax et ajoutez le code suivant à la méthode Application_Start :
System.Data.Entity.Database.SetInitializer(
new ProductStore.Models.OrdersContextInitializer());
Envoyer une demande au contrôleur
À ce stade, nous n’avons pas écrit de code client, mais vous pouvez appeler l’API web à l’aide d’un navigateur web ou d’un outil de débogage HTTP tel que Fiddler. Dans Visual Studio, appuyez sur F5 pour démarrer le débogage. Votre navigateur web s’ouvre sur http://localhost:*portnum*/
, où portnum est un numéro de port.
Envoyez une requête HTTP à «http://localhost:*portnum*/api/admin
. La première demande peut être lente, car Entity Framework doit créer et amorcer la base de données. La réponse doit ressembler à ce qui suit :
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}]