Exercice - Utiliser une base de données existante pour faire de l’ingénierie à rebours

Effectué

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é :

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

  2. Dans le dossier SQLite Explorer, développez les nœuds Promotions.db et Coupons. Notez le schéma de données.

  3. 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 :

  1. 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é.

  2. 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 être DateOnly? 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.

  1. 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.
  2. 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.

  3. 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 :

  1. 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).

  2. Sous l’en-tête Coupon, développez l’opération GET et sélectionnez le bouton Essayer.

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