Übung: Reverse Engineering über eine vorhandene Datenbank

Abgeschlossen

Der Manager von Contoso Pizza hat Sie gebeten, einen Endpunkt hinzuzufügen, damit das Unternehmen Coupons in der App anzeigen kann. Die Coupons befinden sich in einer vorhandenen Datenbank. In dieser Lerneinheit erstellen Sie ein Gerüst über eine vorhandene Datenbank und ändern die daraus resultierende Entitätsklasse.

Untersuchen der Datenbank „Promotions“

Sehen Sie sich die Datenbank an, die Sie zum Generieren des Codegerüsts verwenden werden:

  1. Erweitern Sie im Bereich Explorer das Verzeichnis Promotions, klicken Sie mit der rechten Maustaste auf die Datei Promotions.db, und wählen Sie dann Datenbank öffnen aus.

    Die neue Datenbank wird im Ordner SQLite Explorer geöffnet.

  2. Erweitern Sie im Ordner SQLite Explorer die Knoten Promotions.db und Coupons. Beachten Sie das Datenschema.

  3. Klicken Sie mit der rechten Maustaste auf den Knoten Coupons, und wählen Sie Show table (Tabelle anzeigen) aus. Überprüfen Sie die Coupondaten.

Erstellen eines Gerüsts für den Kontext der Promotion und das Couponmodell

Nun verwenden Sie die Datenbank, um das Codegerüst zu erstellen:

  1. Führen Sie den folgenden Befehl aus:

    dotnet ef dbcontext scaffold "Data Source=Promotions/Promotions.db" Microsoft.EntityFrameworkCore.Sqlite --context-dir Data --output-dir Models   
    

    Der vorherige Befehl:

    • DbContext und Modellklassen werden unter Verwendung der angegebenen Verbindungszeichenfolge erstellt.
    • Es wird angegeben, dass der Datenbankanbieter Microsoft.EntityFrameworkCore.Sqlite verwendet werden soll.
    • Gibt Verzeichnisse für den resultierenden DbContext und die Modellklassen an.

    Hinweis

    In dieser Übung können Sie die Warnung zur Verbindungszeichenfolge im Quellcode ignorieren. Speichern Sie Ihre Zeichenfolgen für realen Code immer an einem sicheren Ort.

  2. Öffnen Sie Models\Coupon.cs, und prüfen Sie das Gerüstmodell.

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

    Da die in SQLite verfügbaren Typen im Vergleich zu C# begrenzt sind, hat das Gerüsterstellungstool Rückschlüsse hinsichtlich der zu verwendenden C#-Typen gemacht. Die Datenbankspalte Expiration ist als Zeichenfolge definiert, weil SQLite keinen date-Datentyp umfasst. Das Gerüsterstellungstool hat basierend auf den Daten in der Datenbank rückgeschlossen, dass der C#-Typ DateOnly? werden soll.

    Tipp

    Wenn die Datenbank geändert wird, können Sie neue Dateigerüste generieren. Die generierten Dateien werden jedes Mal überschrieben, aber als partial-Klassen erstellt, damit Sie sie mit benutzerdefinierten Eigenschaften und Verhaltensweisen in Ihren eigenen, separaten Dateien erweitern können.

Hinzufügen eines Endpunkts für Coupons

Bevor Sie das Codegerüst testen können, müssen Sie der API einen Endpunkt hinzufügen. Als Nächstes fügen Sie also einen neuen API-Controller hinzu.

Informationen zur Funktionsweise von API-Controllern finden Sie unter Erstellen einer Web-API mit ASP.NET Core-Controllern.

  1. Fügen Sie im Ordner Controllers eine Datei mit dem Namen CouponController.cs hinzu, die den folgenden Code enthält:

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

    Durch diesen Code wird der API ein api/coupon-Endpunkt hinzugefügt.

    Für den Code oben gilt:

    • Ein PromotionsContext-Objekt wird in den Konstruktor eingefügt.
    • Die Get-Methode gibt alle Coupons zurück.
  2. Ersetzen Sie den Kommentar // Add the PromotionsContext in der Datei Program.cs durch den folgenden Code:

    builder.Services.AddSqlite<PromotionsContext>("Data Source=Promotions/Promotions.db");
    

    Durch diesen Code wird PromotionsContext beim Abhängigkeitsinjektionssystem registriert.

  3. Speichern Sie alle Änderungen, und führen Sie die App mithilfe von dotnet run aus.

Testen des Endpunkts

Nachdem der Endpunkt hinzugefügt wurde, testen Sie die Vorgänge für Coupons:

  1. Wechseln Sie wie in einer früheren Übung zur Swagger-Benutzeroberfläche der API, oder aktualisieren Sie die vorhandene Benutzeroberfläche im Browser.

  2. Erweitern Sie unter der Überschrift Coupon den GET-Vorgang, und wählen Sie dann Jetzt testen aus.

  3. Klicken Sie auf Ausführen. Der Antworttext zeigt die Coupons aus der Datenbank an:

    [
    {
        "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"
    }
    ]
    

    Beachten Sie, dass expiration ein datetime-Wert ist.

Das ist alles! Sie haben das Gerüst aus einer vorhandenen Datenbank erstellt und geändert.