Übung: Reverse Engineering über eine vorhandene Datenbank

Abgeschlossen

Die Vorgesetzten von Contoso Pizza haben 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:

  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. Die Expiration-Eigenschaft ist als Zeichenfolge definiert, weil SQLite keinen datetime-Datentyp umfasst. Ändern Sie den Expiration-Typ von string? in DateTime. EF Core verwaltet die Konvertierung von datetime-Daten in Zeichenfolgendaten.

    using System;
    using System.Collections.Generic;
    
    namespace ContosoPizza.Models
    {
        public partial class Coupon
        {
            public long Id { get; set; }
            public string Description { get; set; } = null!;
            public DateTime Expiration { get; set; }
        }
    }
    

    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 Try it out (Ausprobieren) 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.