Exercice - Utiliser une base de données existante pour faire de l’ingénierie à rebours
Le responsable de Contoso Pizza vous a demandé d’ajouter un point de terminaison afin que l’entreprise puisse afficher des coupons dans son application. Les coupons résident dans une base de données existante. Dans cette unité, vous allez créer un échafaudage (« scaffolding ») à partir d’une base de données existante et modifier la classe d’entité résultante.
Inspecter la base de données des promotions
Examinez la base de données que vous allez utiliser pour le code échafaudé :
Dans le volet Explorateur, développez le répertoire Promotions, cliquez avec le bouton droit sur le fichier Promotions.db, puis sélectionnez Ouvrir la base de données.
La nouvelle base de données s’ouvre dans le dossier SQLite Explorer.
Dans le dossier SQLite Explorer, développez les nœuds Promotions.db et Coupons. Notez le schéma de données.
Cliquez avec le bouton de droite sur le nœud Coupons et sélectionnez Afficher la table. Inspectez les données du coupon.
Générer automatiquement le modèle du contexte des promotions et le modèle de coupon
Maintenant, utilisez la base de données pour échafauder le code :
Exécutez la commande suivante :
dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models
La commande précédente :
- Échafaude
DbContext
et des classes de modèle à l’aide de la chaîne de connexion fournie. - Spécifie d’utiliser le fournisseur de base de données
Microsoft.EntityFrameworkCore.Sqlite
. - Spécifie des répertoires pour les classes de modèle et
DbContext
résultantes.
Notes
Dans cet exercice, vous pouvez ignorer l’avertissement indiquant que votre chaîne de connexion se trouve dans le code source. Dans du code réel, stockez toujours vos chaînes de connexion dans un emplacement sécurisé.
- Échafaude
Ouvrez Models\Coupon.cs et inspectez le modèle généré.
using System; using System.Collections.Generic; namespace ContosoPizza.Models { public partial class Coupon { public int Id { get; set; } public string Description { get; set; } = null!; public DateOnly? Expiration { get; set; } } }
Étant donné que SQLite a un ensemble limité de types par rapport à C#, l’outil de génération automatique de modèles a effectué des inférences sur les types C# à utiliser. Par exemple, la colonne de base de données
Expiration
a été définie en tant que chaîne, car SQLite n’a pas de type de données de date. L’outil de génération automatique de modèles déduit que le type C# doit êtreDateOnly?
en fonction des données de la base de données.Conseil
Si la base de données change, vous pouvez générer de nouveaux fichiers échafaudés. Les fichiers générés sont remplacés à chaque fois, mais ils sont créés en tant que classes
partial
. Vous pouvez donc les étendre avec des propriétés et des comportements personnalisés dans vos propres fichiers distincts.
Ajouter un point de terminaison de coupon
Avant de pouvoir tester le code échafaudé, vous devez ajouter un point de terminaison à l’API. Ensuite, ajoutez un nouveau contrôleur d’API.
Pour mieux comprendre leur fonctionnement, consultez Créer une API web avec des contrôleurs ASP.NET Core.
Dans le dossier Controllers, ajoutez un fichier nommé CouponController.cs qui contient le code suivant :
using ContosoPizza.Data; using ContosoPizza.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace ContosoPizza.Controllers; [ApiController] [Route("[controller]")] public class CouponController : ControllerBase { PromotionsContext _context; public CouponController(PromotionsContext context) { _context = context; } [HttpGet] public IEnumerable<Coupon> Get() { return _context.Coupons .AsNoTracking() .ToList(); } }
Ce code ajoute un point de terminaison
api/coupon
à l’API.Dans le code précédent :
- Un objet
PromotionsContext
est injecté dans le constructeur. - La méthode
Get
retourne tous les coupons.
- Un objet
Dans Program.cs, remplacez le commentaire
// Add the PromotionsContext
par le code suivant :builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
Ce code inscrit
PromotionsContext
auprès du système d’injection de dépendances.Enregistrez toutes vos modifications et exécutez l’application avec
dotnet run
.
Tester le point de terminaison
Maintenant que le point de terminaison est ajouté, testez les opérations relatives aux coupons :
Accédez à l’interface utilisateur Swagger de l’API comme vous l’avez fait dans un exercice précédent (ou actualisez l’interface utilisateur existante dans votre navigateur).
Sous l’en-tête Coupon, développez l’opération GET et sélectionnez le bouton Essayer.
Sélectionnez Exécuter. Le corps de la réponse affiche les coupons de la base de données :
[ { "id": 1, "description": "Buy 1 get 1 free", "expiration": "2025-01-01T00:00:00" }, { "id": 2, "description": "4 large pizzas for $40", "expiration": "2024-06-30T00:00:00" } ]
Notez que
expiration
est une valeur DateHeure.
Et voilà ! Vous avez créé et modifié la génération automatique de modèles à partir d’une base de données existante.