Teil 2: Hinzufügen eines Modells zu einer Razor Pages-App in ASP.NET Core

Hinweis

Dies ist nicht die neueste Version dieses Artikels. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Wichtig

Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.

Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

In diesem Tutorial werden Klassen für die Verwaltung von Filmen in einer Datenbank hinzugefügt. Die Modellklassen der App verwenden Entity Framework Core (EF Core), um mit der Datenbank zu arbeiten. EF Core ist ein objektrelationaler Mapper (O/RM), der den Datenzugriff vereinfacht. Sie schreiben zuerst die Modellklassen. Anschließend erstellt EF Core die Datenbank.

Die Modellklassen werden als POCO-Klassen (von „Plain-Old CLR Objects“) bezeichnet, da sie keinerlei Abhängigkeit von EF Core aufweisen. Sie definieren die Eigenschaften einer Datei, die in der Datenbank gespeichert ist.

Hinzufügen eines Datenmodells

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie. Klicken Sie dann auf >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen Modelsanmelden.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner Models. Wählen Sie Hinzufügen>Klasse aus. Nennen Sie die Klasse Movie.

  3. Fügen Sie der Klasse Movie die folgenden Eigenschaften hinzu:

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Die Movie-Klasse enthält:

  • Die Datenbank benötigt das Feld ID für den primären Schlüssel.

  • Ein [DataType]-Attribut, das den Datentyp in der ReleaseDate-Eigenschaft angibt. Mit diesem Attribut:

    • Der Benutzer muss keine Zeitinformationen in das Datumsfeld eingeben.
    • Nur das Datum wird angezeigt, keine Zeitinformationen.
  • Das Fragezeichen nach string gibt an, dass die Eigenschaft Nullwerte zulässt. Weitere Informationen finden Sie unter Nullable-Verweistypen.

DataAnnotations werden in einem späteren Tutorial behandelt.

Erstellen Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler vorliegen.

Erstellen des Gerüsts für das Filmmodell

In diesem Abschnitt wird das Gerüst für das Filmmodell erstellt. Mit dem Tool für den Gerüstbau werden Seiten für die Vorgänge „Create“ (Erstellen), „Read“ (Lesen), „Update“ (Aktualisieren) und „Delete“ (Löschen), kurz CRUD-Vorgänge, für das Filmmodell erstellt.

  1. Erstellen Sie den Ordner Pages/Movies:

    1. Klicken Sie mit der rechten Maustaste auf den Ordner Pages>Hinzufügen>Neuer Ordner.
    2. Nennen Sie den Ordner Movies.
  2. Klicken Sie mit der rechten Maustaste auf den Ordner Pages/Movies>Hinzufügen>Neues Gerüstelement.

    Neues Gerüstelement

  3. Wählen Sie im Dialogfeld Neues Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.

    Dialogfeld

  4. Vervollständigen Sie das Dialogfeld Add Razor Pages using Entity Framework (CRUD) (Razor-Seiten mithilfe des Entity Frameworks (CRUD) hinzufügen):

    1. Wählen Sie in der Dropdownliste Modellklasse den Eintrag Film (RazorPagesMovie.Models) aus.
    2. Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
      1. Im Dialogfeld Datenkontext hinzufügen wird der Klassenname RazorPagesMovie.Data.RazorPagesMovieContext generiert.
      2. Wählen Sie in der Dropdownliste Datenbankanbieter die Option SQL Server aus.
    3. Wählen Sie Hinzufügen.

    Hinzufügen von Razor Pages

Die Datei appsettings.json wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.

Erstellte und aktualisierte Dateien

Der Gerüstbauprozess erstellt die folgenden Dateien:

  • Pages/Movies: „Create“, „Delete“, „Details“, „Edit“ und „Index“.
  • Data/RazorPagesMovieContext.cs

Die erstellten Daten werden im nächsten Tutorial erläutert.

Der Gerüstbauprozess fügt der Datei Program.cs den folgenden hervorgehobenen Code hinzu:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Die Änderungen an Program.cs werden später in diesem Tutorial erläutert.

Erstellen des anfängliche, Datenbankschema mithilfe des EF-Features „Migrationen“

Das Feature „Migrationen“ in Entity Framework Core ermöglicht Folgendes:

  • Erstellen des anfänglichen Datenbankschemas
  • Schrittweises Aktualisieren des Datenbankschemas, um es mit dem Datenmodell der App synchron zu halten. In der Datenbank vorhandene Daten werden beibehalten.

In diesem Abschnitt wird das Fenster Paket-Manager-Konsole (Package Manager Console, PMC) für Folgendes verwendet:

  • Fügen Sie eine anfängliche Migration hinzu.
  • Aktualisieren Sie die Datenbank mit der anfänglichen Migration.
  1. Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.

    PMC-Menü

  2. Geben Sie in der PMC die folgenden Befehle ein:

    Add-Migration InitialCreate
    Update-Database
    
  • Mit dem Befehl Add-Migration wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das in DbContext angegeben ist. Das Argument InitialCreate wird verwendet, um die Migration zu benennen. Es kann jeder Name verwendet werden, aber per Konvention wird ein Name ausgewählt, der die Migration beschreibt.

  • Der Update-Database-Befehl führt die Up-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt der Befehl die Up-Methode in der Datei Migrations/<time-stamp>_InitialCreate.cs aus, mit der die Datenbank erstellt wird.

Es wird die folgende Warnung angezeigt, die in einem späteren Schritt behandelt wird:

No type was specified for the decimal column 'Price' on entity type 'Movie'. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Für die Spalte „Price“ mit Dezimalwerten für den Entitätstyp „Movie“ wurde kein Typ angegeben. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Geben Sie den Spaltentyp von SQL-Server explizit an, der durch „ForHasColumnType()“ sämtliche Werte unterstützen kann.)

Der Datenkontext RazorPagesMovieContext:

  • Wird von Microsoft.EntityFrameworkCore.DbContext abgeleitet.
  • Gibt an, welche Entitäten im Datenmodell enthalten sind.
  • Koordiniert die EF Core-Funktionen (Create, Read, Update und Delete) für das Movie-Modell.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

Der vorangehende Code erstellt eine DbSet<Movie>-Eigenschaft für die Entitätenmenge. In der Terminologie von Entity Framework entspricht eine Entitätenmenge in der Regel einer Datenbanktabelle. Entitäten entsprechen Zeilen in Tabellen.

Der Name der Verbindungszeichenfolge wird an den Kontext übergeben, indem Sie eine Methode auf einem DbContextOptions-Objekt aufrufen. Für die lokale Entwicklung liest das -Konfigurationssystem die Verbindungszeichenfolge aus der Datei appsettings.json.

Testen der App

  1. Führen Sie die App aus, und fügen Sie /Movies an die URL im Browser an (http://localhost:port/movies).

    Möglicherweise wird eine Fehlermeldung wie diese angezeigt:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Sie haben den Migrationsschritt verpasst.

  2. Testen Sie den Link Neu erstellen.

    Seite „Create“

    Hinweis

    Sie können unter Umständen in das Feld Price keine Kommas als Dezimaltrennzeichen eingeben. Zur Unterstützung der jQuery-Validierung für Gebietsschemas mit einer anderen Sprache als Englisch, in denen ein Komma („,“) als Dezimaltrennzeichen verwendet wird, und für Datums- und Uhrzeitformate, die nicht dem US-englischen Format entsprechen, muss die App globalisiert werden. Globalisierungsanweisungen finden Sie unter GitHub-Problem.

  3. Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen).

Im nächsten Tutorial finden Sie Erläuterungen zu den Dateien, die durch den Gerüstbau erstellt wurden.

Überprüfen des mit Dependency Injection registrierten Kontexts

ASP.NET Core wird mit Dependency Injection erstellt. Dienste wie der EF Core-Datenbankkontext werden per Dependency Injection beim Anwendungsstart registriert. Komponenten, die diese Dienste erfordern (z. B. Razor Pages), werden über Konstruktorparameter bereitgestellt. Der Konstruktorcode, der eine Datenbankkontextinstanz abruft, wird später in diesem Tutorial erläutert.

Das Tool für den Gerüstbau hat automatisch einen Datenbankkontext erstellt und diesen beim Dependency Injection-Container registriert. Der Datei Program.cs wird der folgende hervorgehobene Code durch den Gerüstbauprozess hinzugefügt:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Problembehandlung mit dem fertiggestellten Beispiel

Wenn Sie auf ein Problem stoßen, das Sie nicht lösen können, vergleichen Sie Ihren den Code mit dem vollständigen Projekt. Anzeigen oder Herunterladen des fertiggestellten Projekts (Downloadanleitung).

Nächste Schritte

In diesem Tutorial werden Klassen für die Verwaltung von Filmen in einer Datenbank hinzugefügt. Die Modellklassen der App verwenden Entity Framework Core (EF Core), um mit der Datenbank zu arbeiten. EF Core ist ein objektrelationaler Mapper (O/RM), der den Datenzugriff vereinfacht. Sie schreiben zuerst die Modellklassen. Anschließend erstellt EF Core die Datenbank.

Die Modellklassen werden als POCO-Klassen (von „Plain-Old CLR Objects“) bezeichnet, da sie keinerlei Abhängigkeit von EF Core aufweisen. Sie definieren die Eigenschaften einer Datei, die in der Datenbank gespeichert ist.

Hinzufügen eines Datenmodells

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie. Klicken Sie dann auf >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen Modelsanmelden.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner Models. Wählen Sie Hinzufügen>Klasse aus. Nennen Sie die Klasse Movie.

  3. Fügen Sie der Klasse Movie die folgenden Eigenschaften hinzu:

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Die Movie-Klasse enthält:

  • Die Datenbank benötigt das Feld ID für den primären Schlüssel.

  • Ein [DataType]-Attribut, das den Datentyp in der ReleaseDate-Eigenschaft angibt. Mit diesem Attribut:

    • Der Benutzer muss keine Zeitinformationen in das Datumsfeld eingeben.
    • Nur das Datum wird angezeigt, keine Zeitinformationen.
  • Das Fragezeichen nach string gibt an, dass die Eigenschaft Nullwerte zulässt. Weitere Informationen finden Sie unter Nullable-Verweistypen.

DataAnnotations werden in einem späteren Tutorial behandelt.

Erstellen Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler vorliegen.

Erstellen des Gerüsts für das Filmmodell

In diesem Abschnitt wird das Gerüst für das Filmmodell erstellt. Mit dem Tool für den Gerüstbau werden Seiten für die Vorgänge „Create“ (Erstellen), „Read“ (Lesen), „Update“ (Aktualisieren) und „Delete“ (Löschen), kurz CRUD-Vorgänge, für das Filmmodell erstellt.

  1. Erstellen Sie den Ordner Pages/Movies:

    1. Klicken Sie mit der rechten Maustaste auf den Ordner Pages>Hinzufügen>Neuer Ordner.
    2. Nennen Sie den Ordner Movies.
  2. Klicken Sie mit der rechten Maustaste auf den Ordner Pages/Movies>Hinzufügen>Neues Gerüstelement.

    Neues Gerüstelement

  3. Wählen Sie im Dialogfeld Neues Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.

    Dialogfeld

  4. Vervollständigen Sie das Dialogfeld Add Razor Pages using Entity Framework (CRUD) (Razor-Seiten mithilfe des Entity Frameworks (CRUD) hinzufügen):

    1. Wählen Sie in der Dropdownliste Modellklasse den Eintrag Film (RazorPagesMovie.Models) aus.
    2. Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
      1. Im Dialogfeld Datenkontext hinzufügen wird der Klassenname RazorPagesMovie.Data.RazorPagesMovieContext generiert.
      2. Wählen Sie in der Dropdownliste Datenbankanbieter die Option SQL Server aus.
    3. Wählen Sie Hinzufügen.

    Hinzufügen von Razor Pages

Die Datei appsettings.json wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.

Erstellte und aktualisierte Dateien

Der Gerüstbauprozess erstellt die folgenden Dateien:

  • Pages/Movies: „Create“, „Delete“, „Details“, „Edit“ und „Index“.
  • Data/RazorPagesMovieContext.cs

Die erstellten Daten werden im nächsten Tutorial erläutert.

Der Gerüstbauprozess fügt der Datei Program.cs den folgenden hervorgehobenen Code hinzu:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Die Änderungen an Program.cs werden später in diesem Tutorial erläutert.

Erstellen des anfängliche, Datenbankschema mithilfe des EF-Features „Migrationen“

Das Feature „Migrationen“ in Entity Framework Core ermöglicht Folgendes:

  • Erstellen des anfänglichen Datenbankschemas
  • Schrittweises Aktualisieren des Datenbankschemas, um es mit dem Datenmodell der App synchron zu halten. In der Datenbank vorhandene Daten werden beibehalten.

In diesem Abschnitt wird das Fenster Paket-Manager-Konsole (Package Manager Console, PMC) für Folgendes verwendet:

  • Fügen Sie eine anfängliche Migration hinzu.
  • Aktualisieren Sie die Datenbank mit der anfänglichen Migration.
  1. Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.

    PMC-Menü

  2. Geben Sie in der PMC die folgenden Befehle ein:

    Add-Migration InitialCreate
    Update-Database
    
  • Mit dem Befehl Add-Migration wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das in DbContext angegeben ist. Das Argument InitialCreate wird verwendet, um die Migration zu benennen. Es kann jeder Name verwendet werden, aber per Konvention wird ein Name ausgewählt, der die Migration beschreibt.

  • Der Update-Database-Befehl führt die Up-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt der Befehl die Up-Methode in der Datei Migrations/<time-stamp>_InitialCreate.cs aus, mit der die Datenbank erstellt wird.

Es wird die folgende Warnung angezeigt, die in einem späteren Schritt behandelt wird:

No type was specified for the decimal column 'Price' on entity type 'Movie'. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Für die Spalte „Price“ mit Dezimalwerten für den Entitätstyp „Movie“ wurde kein Typ angegeben. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Geben Sie den Spaltentyp von SQL-Server explizit an, der durch „ForHasColumnType()“ sämtliche Werte unterstützen kann.)

Der Datenkontext RazorPagesMovieContext:

  • Wird von Microsoft.EntityFrameworkCore.DbContext abgeleitet.
  • Gibt an, welche Entitäten im Datenmodell enthalten sind.
  • Koordiniert die EF Core-Funktionen (Create, Read, Update und Delete) für das Movie-Modell.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

Der vorangehende Code erstellt eine DbSet<Movie>-Eigenschaft für die Entitätenmenge. In der Terminologie von Entity Framework entspricht eine Entitätenmenge in der Regel einer Datenbanktabelle. Entitäten entsprechen Zeilen in Tabellen.

Der Name der Verbindungszeichenfolge wird an den Kontext übergeben, indem Sie eine Methode auf einem DbContextOptions-Objekt aufrufen. Für die lokale Entwicklung liest das -Konfigurationssystem die Verbindungszeichenfolge aus der Datei appsettings.json.

Testen der App

  1. Führen Sie die App aus, und fügen Sie /Movies an die URL im Browser an (http://localhost:port/movies).

    Möglicherweise wird eine Fehlermeldung wie diese angezeigt:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Sie haben den Migrationsschritt verpasst.

  2. Testen Sie den Link Neu erstellen.

    Seite „Create“

    Hinweis

    Sie können unter Umständen in das Feld Price keine Kommas als Dezimaltrennzeichen eingeben. Zur Unterstützung der jQuery-Validierung für Gebietsschemas mit einer anderen Sprache als Englisch, in denen ein Komma („,“) als Dezimaltrennzeichen verwendet wird, und für Datums- und Uhrzeitformate, die nicht dem US-englischen Format entsprechen, muss die App globalisiert werden. Globalisierungsanweisungen finden Sie unter GitHub-Problem.

  3. Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen).

Im nächsten Tutorial finden Sie Erläuterungen zu den Dateien, die durch den Gerüstbau erstellt wurden.

Überprüfen des mit Dependency Injection registrierten Kontexts

ASP.NET Core wird mit Dependency Injection erstellt. Dienste wie der EF Core-Datenbankkontext werden per Dependency Injection beim Anwendungsstart registriert. Komponenten, die diese Dienste erfordern (z. B. Razor Pages), werden über Konstruktorparameter bereitgestellt. Der Konstruktorcode, der eine Datenbankkontextinstanz abruft, wird später in diesem Tutorial erläutert.

Das Tool für den Gerüstbau hat automatisch einen Datenbankkontext erstellt und diesen beim Dependency Injection-Container registriert. Der Datei Program.cs wird der folgende hervorgehobene Code durch den Gerüstbauprozess hinzugefügt:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Problembehandlung mit dem fertiggestellten Beispiel

Wenn Sie auf ein Problem stoßen, das Sie nicht lösen können, vergleichen Sie Ihren den Code mit dem vollständigen Projekt. Anzeigen oder Herunterladen des fertiggestellten Projekts (Downloadanleitung).

Nächste Schritte

In diesem Tutorial werden Klassen für die Verwaltung von Filmen in einer Datenbank hinzugefügt. Die Modellklassen der App verwenden Entity Framework Core (EF Core), um mit der Datenbank zu arbeiten. EF Core ist ein objektrelationaler Mapper (O/RM), der den Datenzugriff vereinfacht. Sie schreiben zuerst die Modellklassen. Anschließend erstellt EF Core die Datenbank.

Die Modellklassen werden als POCO-Klassen (von „Plain-Old CLR Objects“) bezeichnet, da sie keinerlei Abhängigkeit von EF Core aufweisen. Sie definieren die Eigenschaften einer Datei, die in der Datenbank gespeichert ist.

Hinzufügen eines Datenmodells

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie. Klicken Sie dann auf >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen Modelsanmelden.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner Models. Wählen Sie Hinzufügen>Klasse aus. Nennen Sie die Klasse Movie.

  3. Fügen Sie der Klasse Movie die folgenden Eigenschaften hinzu:

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; } = string.Empty;
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; } = string.Empty;
            public decimal Price { get; set; }
        }
    }
    

Die Movie-Klasse enthält:

  • Die Datenbank benötigt das Feld ID für den primären Schlüssel.

  • Ein [DataType]-Attribut, das den Datentyp in der ReleaseDate-Eigenschaft angibt. Mit diesem Attribut:

    • Der Benutzer muss keine Zeitinformationen in das Datumsfeld eingeben.
    • Nur das Datum wird angezeigt, keine Zeitinformationen.

DataAnnotations werden in einem späteren Tutorial behandelt.

Erstellen Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler vorliegen.

Erstellen des Gerüsts für das Filmmodell

In diesem Abschnitt wird das Gerüst für das Filmmodell erstellt. Mit dem Tool für den Gerüstbau werden Seiten für die Vorgänge „Create“ (Erstellen), „Read“ (Lesen), „Update“ (Aktualisieren) und „Delete“ (Löschen), kurz CRUD-Vorgänge, für das Filmmodell erstellt.

  1. Fügen Sie das NuGet Paket Microsoft.EntityFrameworkCore.Design hinzu, das für das Gerüstbautool erforderlich ist.

    1. Wählen Sie im Menü Extras die Option NuGet-Paket-Manager>NuGet-Pakete für Projektmappe verwaltenNuGet-Paket-Manager – verwalten aus.
    2. Wählen Sie die Registerkarte Durchsuchen aus.
    3. Geben Sie Microsoft.EntityFrameworkCore.Design ein, und wählen Sie diese Option aus der Liste aus.
    4. Aktivieren Sie Projekt, und wählen Sie dann Installieren aus.
    5. Wählen Sie im Dialogfeld Zustimmung zur Lizenz die Option Annehmen aus. NuGet Paket-Manager: Paket hinzufügen
  2. Erstellen Sie den Ordner Pages/Movies:

    1. Klicken Sie mit der rechten Maustaste auf den Ordner Pages>Hinzufügen>Neuer Ordner.
    2. Nennen Sie den Ordner Movies.
  3. Klicken Sie mit der rechten Maustaste auf den Ordner Pages/Movies>Hinzufügen>Neues Gerüstelement.

    Neues Gerüstelement

  4. Wählen Sie im Dialogfeld Neues Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.

    Dialogfeld

  5. Vervollständigen Sie das Dialogfeld Add Razor Pages using Entity Framework (CRUD) (Razor-Seiten mithilfe des Entity Frameworks (CRUD) hinzufügen):

    1. Wählen Sie in der Dropdownliste Modellklasse den Eintrag Film (RazorPagesMovie.Models) aus.
    2. Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
      1. Im Dialogfeld Datenkontext hinzufügen wird der Klassenname RazorPagesMovie.Data.RazorPagesMovieContext generiert.
    3. Wählen Sie Hinzufügen.

    Hinzufügen von Razor Pages

    Wenn Sie eine Fehlermeldung erhalten, die besagt, dass Sie das Paket Microsoft.EntityFrameworkCore.SqlServer installieren müssen, wiederholen Sie die Schritte beginnend mit Hinzufügen>Neues Gerüstbauelement.

Die Datei appsettings.json wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.

Erstellte und aktualisierte Dateien

Der Gerüstbauprozess erstellt die folgenden Dateien:

  • Pages/Movies: „Create“, „Delete“, „Details“, „Edit“ und „Index“.
  • Data/RazorPagesMovieContext.cs

Die erstellten Daten werden im nächsten Tutorial erläutert.

Der Gerüstbauprozess fügt der Datei Program.cs den folgenden hervorgehobenen Code hinzu:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Die Änderungen an Program.cs werden später in diesem Tutorial erläutert.

Erstellen des anfängliche, Datenbankschema mithilfe des EF-Features „Migrationen“

Das Feature „Migrationen“ in Entity Framework Core ermöglicht Folgendes:

  • Erstellen des anfänglichen Datenbankschemas
  • Schrittweises Aktualisieren des Datenbankschemas, um es mit dem Datenmodell der App synchron zu halten. In der Datenbank vorhandene Daten werden beibehalten.

In diesem Abschnitt wird das Fenster Paket-Manager-Konsole (Package Manager Console, PMC) für Folgendes verwendet:

  • Fügen Sie eine anfängliche Migration hinzu.
  • Aktualisieren Sie die Datenbank mit der anfänglichen Migration.
  1. Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.

    PMC-Menü

  2. Geben Sie in der PMC die folgenden Befehle ein:

    Add-Migration InitialCreate
    Update-Database
    
    

Mit den vorherigen Befehlen installieren Sie die Entity Framework Core-Tools und führen den Befehl migrations aus, um Code zu generieren, mit dem das erste Datenbankschema erstellt wird.

Es wird die folgende Warnung angezeigt, die in einem späteren Schritt behandelt wird:

No type was specified for the decimal column 'Price' on entity type 'Movie'. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Für die Spalte „Price“ mit Dezimalwerten für den Entitätstyp „Movie“ wurde kein Typ angegeben. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Geben Sie den Spaltentyp von SQL-Server explizit an, der durch „ForHasColumnType()“ sämtliche Werte unterstützen kann.)

Mit dem Befehl migrations wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das in DbContext angegeben ist. Das Argument InitialCreate wird verwendet, um die Migrationen zu benennen. Es kann jeder Name verwendet werden, aber per Konvention wird ein Name ausgewählt, der die Migration beschreibt.

Der update-Befehl führt die Up-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt update die Up-Methode in der Datei Migrations/<time-stamp>_InitialCreate.cs aus, mit der die Datenbank erstellt wird.

Überprüfen des mit Dependency Injection registrierten Kontexts

ASP.NET Core wird mit Dependency Injection erstellt. Dienste wie der EF Core-Datenbankkontext werden per Dependency Injection beim Anwendungsstart registriert. Komponenten, die diese Dienste erfordern (z. B. Razor Pages), werden über Konstruktorparameter bereitgestellt. Der Konstruktorcode, der eine Datenbankkontextinstanz abruft, wird später in diesem Tutorial erläutert.

Das Tool für den Gerüstbau hat automatisch einen Datenbankkontext erstellt und diesen beim Dependency Injection-Container registriert. Der Datei Program.cs wird der folgende hervorgehobene Code durch den Gerüstbauprozess hinzugefügt:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Der Datenkontext RazorPagesMovieContext:

  • Wird von Microsoft.EntityFrameworkCore.DbContext abgeleitet.
  • Gibt an, welche Entitäten im Datenmodell enthalten sind.
  • Koordiniert die EF Core-Funktionen (Create, Read, Update und Delete) für das Movie-Modell.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
    }
}

Der vorangehende Code erstellt eine DbSet<Movie>-Eigenschaft für die Entitätenmenge. In der Terminologie von Entity Framework entspricht eine Entitätenmenge in der Regel einer Datenbanktabelle. Entitäten entsprechen Zeilen in Tabellen.

Der Name der Verbindungszeichenfolge wird an den Kontext übergeben, indem Sie eine Methode auf einem DbContextOptions-Objekt aufrufen. Für die lokale Entwicklung liest das -Konfigurationssystem die Verbindungszeichenfolge aus der Datei appsettings.json.

Testen der App

  1. Führen Sie die App aus, und fügen Sie /Movies an die URL im Browser an (http://localhost:port/movies).

    Möglicherweise wird eine Fehlermeldung wie diese angezeigt:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Sie haben den Migrationsschritt verpasst.

  2. Testen Sie den Link Neu erstellen.

    Seite „Create“

    Hinweis

    Sie können unter Umständen in das Feld Price keine Kommas als Dezimaltrennzeichen eingeben. Zur Unterstützung der jQuery-Validierung für Gebietsschemas mit einer anderen Sprache als Englisch, in denen ein Komma („,“) als Dezimaltrennzeichen verwendet wird, und für Datums- und Uhrzeitformate, die nicht dem US-englischen Format entsprechen, muss die App globalisiert werden. Globalisierungsanweisungen finden Sie unter GitHub-Problem.

  3. Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen).

Im nächsten Tutorial finden Sie Erläuterungen zu den Dateien, die durch den Gerüstbau erstellt wurden.

Problembehandlung mit dem fertiggestellten Beispiel

Wenn Sie auf ein Problem stoßen, das Sie nicht lösen können, vergleichen Sie Ihren den Code mit dem vollständigen Projekt. Anzeigen oder Herunterladen des fertiggestellten Projekts (Downloadanleitung).

Nächste Schritte

In diesem Abschnitt werden Klassen für die Verwaltung von Filmen in einer Datenbank hinzugefügt. Die Modellklassen der App verwenden Entity Framework Core (EF Core), um mit der Datenbank zu arbeiten. EF Core ist ein objektrelationaler Mapper (O/RM), der den Datenzugriff vereinfacht. Sie schreiben zuerst die Modellklassen. Anschließend erstellt EF Core die Datenbank.

Die Modellklassen werden als POCO-Klassen (von „Plain-Old CLR Objects“) bezeichnet, da sie keinerlei Abhängigkeit von EF Core aufweisen. Sie definieren die Eigenschaften einer Datei, die in der Datenbank gespeichert ist.

Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).

Hinzufügen eines Datenmodells

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie. Klicken Sie dann auf >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen Modelsanmelden.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner Models. Wählen Sie Hinzufügen>Klasse aus. Nennen Sie die Klasse Movie.

  3. Fügen Sie der Klasse Movie die folgenden Eigenschaften hinzu:

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
        }
    }
    

Die Movie-Klasse enthält:

  • Die Datenbank benötigt das Feld ID für den primären Schlüssel.

  • [DataType(DataType.Date)]: Das Attribut [DataType] gibt den Typ der Daten (Date) an. Mit diesem Attribut:

    • Der Benutzer muss keine Zeitinformationen in das Datumsfeld eingeben.
    • Nur das Datum wird angezeigt, keine Zeitinformationen.

DataAnnotations werden in einem späteren Tutorial behandelt.

Erstellen Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler vorliegen.

Erstellen des Gerüsts für das Filmmodell

In diesem Abschnitt wird das Gerüst für das Filmmodell erstellt. Mit dem Tool für den Gerüstbau werden Seiten für die Vorgänge „Create“ (Erstellen), „Read“ (Lesen), „Update“ (Aktualisieren) und „Delete“ (Löschen), kurz CRUD-Vorgänge, für das Filmmodell erstellt.

  1. Erstellen Sie den Ordner Pages/Movies:

    1. Klicken Sie mit der rechten Maustaste auf den Ordner Pages>Hinzufügen>Neuer Ordner.
    2. Nennen Sie den Ordner Movies.
  2. Klicken Sie mit der rechten Maustaste auf den Ordner Pages/Movies>Hinzufügen>Neues Gerüstelement.

    Neues Gerüstelement

  3. Wählen Sie im Dialogfeld Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.

    Dialogfeld

  4. Vervollständigen Sie das Dialogfeld Add Razor Pages using Entity Framework (CRUD) (Razor-Seiten mithilfe des Entity Frameworks (CRUD) hinzufügen):

    1. Wählen Sie in der Dropdownliste Modellklasse den Eintrag Film (RazorPagesMovie.Models) aus.
    2. Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
      1. Im Dialogfeld Datenkontext hinzufügen wird der Klassenname RazorPagesMovie.Data.RazorPagesMovieContext generiert.
    3. Wählen Sie Hinzufügen.

    Hinzufügen von Razor Pages

Die Datei appsettings.json wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.

Erstellte und aktualisierte Dateien

Der Gerüstbauprozess erstellt die folgenden Dateien:

  • Pages/Movies: „Create“, „Delete“, „Details“, „Edit“ und „Index“.
  • Data/RazorPagesMovieContext.cs

Aktualisierte Dateien

  • Startup.cs

Die erstellten und aktualisierten Daten werden im nächsten Abschnitt erläutert.

Erstellen des anfängliche, Datenbankschema mithilfe des EF-Features „Migrationen“

Das Feature „Migrationen“ in Entity Framework Core ermöglicht Folgendes:

  • Erstellen des anfänglichen Datenbankschemas
  • Schrittweises Aktualisieren des Datenbankschemas, um es mit dem Datenmodell der Anwendung synchron zu halten. In der Datenbank vorhandene Daten werden beibehalten.

In diesem Abschnitt wird das Fenster Paket-Manager-Konsole (Package Manager Console, PMC) für Folgendes verwendet:

  • Fügen Sie eine anfängliche Migration hinzu.
  • Aktualisieren Sie die Datenbank mit der anfänglichen Migration.
  1. Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.

    PMC-Menü

  2. Geben Sie in der PMC die folgenden Befehle ein:

    Add-Migration InitialCreate
    Update-Database
    

Bei SQL Server wird durch obige Befehle die folgende Warnung erstellt: "No type was specified for the decimal column 'Price' on entity type 'Movie'. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'." („Für die Spalte „Price“ mit Dezimalwerten beim Entitätstyp „Movie“ wurde kein Typ angegeben. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Geben Sie den Spaltentyp von SQL-Server an, der durch „ForHasColumnType()“ sämtliche Werte unterstützen kann.")

Ignorieren Sie die Warnung, da sie in einem späteren Schritt behandelt wird.

Mit dem Befehl migrations wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das in DbContext angegeben ist. Das Argument InitialCreate wird verwendet, um die Migrationen zu benennen. Es kann jeder Name verwendet werden, aber per Konvention wird ein Name ausgewählt, der die Migration beschreibt.

Der update-Befehl führt die Up-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt update die Up-Methode in der Datei Migrations/<time-stamp>_InitialCreate.cs aus, mit der die Datenbank erstellt wird.

Überprüfen des mit Dependency Injection registrierten Kontexts

ASP.NET Core wird mit Dependency Injection erstellt. Dienste wie der EF Core-Datenbankkontext werden per Dependency Injection beim Anwendungsstart registriert. Komponenten, die diese Dienste erfordern (z. B. Razor Pages), werden über Konstruktorparameter bereitgestellt. Der Konstruktorcode, der eine Datenbankkontextinstanz abruft, wird später in diesem Tutorial erläutert.

Das Tool für den Gerüstbau hat automatisch einen Datenbankkontext erstellt und diesen beim Dependency Injection-Container registriert.

Untersuchen Sie die Methode Startup.ConfigureServices. Die hervorgehobene Zeile wurde vom Gerüst hinzugefügt:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Der RazorPagesMovieContext koordiniert die EF Core-Funktionen (Create, Read, Update und Delete) für das Movie-Modell. Der Datenkontext (RazorPagesMovieContext) wird aus Microsoft.EntityFrameworkCore.DbContext abgeleitet. Der Datenkontext gibt an, welche Entitäten im Datenmodell enthalten sind.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Der vorangehende Code erstellt eine DbSet<Movie>-Eigenschaft für die Entitätenmenge. In der Terminologie von Entity Framework entspricht eine Entitätenmenge in der Regel einer Datenbanktabelle. Entitäten entsprechen Zeilen in Tabellen.

Der Name der Verbindungszeichenfolge wird an den Kontext übergeben, indem Sie eine Methode auf einem DbContextOptions-Objekt aufrufen. Für die lokale Entwicklung liest das -Konfigurationssystem die Verbindungszeichenfolge aus der Datei appsettings.json.

Testen der App

  1. Führen Sie die App aus, und fügen Sie /Movies an die URL im Browser an (http://localhost:port/movies).

    Möglicherweise wird eine Fehlermeldung wie diese angezeigt:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Sie haben den Migrationsschritt verpasst.

  2. Testen Sie den Link Create (Erstellen).

    Seite „Create“

    Hinweis

    Sie können unter Umständen in das Feld Price keine Kommas als Dezimaltrennzeichen eingeben. Zur Unterstützung der jQuery-Validierung für Gebietsschemas mit einer anderen Sprache als Englisch, in denen ein Komma („,“) als Dezimaltrennzeichen verwendet wird, und für Datums- und Uhrzeitformate, die nicht dem US-englischen Format entsprechen, muss die App globalisiert werden. Globalisierungsanweisungen finden Sie unter GitHub-Problem.

  3. Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen).

SQL Protokollierung von Entity Framework Core

Die Konfiguration der Protokollierung wird meistens im Abschnitt Logging der appsettings.{Environment}.json-Dateien angegeben. Um SQL Anweisungen zu protokollieren, fügen Sie "Microsoft.EntityFrameworkCore.Database.Command": "Information" der Datei appsettings.Development.json hinzu:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}

Mit dem obigen JSON-Code werden SQL Anweisungen in der Befehlszeile und im Visual Studio Ausgabefenster angezeigt.

Weitere Informationen finden Sie im Artikel zum Protokollieren in .NET Core und ASP.NET Core und in diesem GitHub-Issue.

Im nächsten Tutorial finden Sie Erläuterungen zu den Dateien, die durch den Gerüstbau erstellt wurden.

Nächste Schritte

In diesem Abschnitt werden Klassen für die Verwaltung von Filmen hinzugefügt. Die Modellklassen der App verwenden Entity Framework Core (EF Core), um mit der Datenbank zu arbeiten. EF Core ist ein objektrelationaler Mapper (O/RM), der den Datenzugriff vereinfacht.

Die Modellklassen werden als POCO-Klassen (von „Plain-Old CLR Objects“) bezeichnet, da sie keinerlei Abhängigkeit von EF Core aufweisen. Sie definieren die Eigenschaften einer Datei, die in der Datenbank gespeichert ist.

Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).

Hinzufügen eines Datenmodells

Klicken Sie mit der rechten Maustaste auf das Projekt RazorPagesMovie und dann auf >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen Modelsanmelden.

Klicken Sie mit der rechten Maustaste auf den Ordner Models. Wählen Sie Hinzufügen>Klasse aus. Nennen Sie die Klasse Movie.

Fügen Sie der Klasse Movie die folgenden Eigenschaften hinzu:

using System;
using System.ComponentModel.DataAnnotations;

namespace RazorPagesMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Die Movie-Klasse enthält:

  • Die Datenbank benötigt das Feld ID für den primären Schlüssel.

  • [DataType(DataType.Date)]: Das DataType-Attribut gibt den Typ der Daten (Date) an. Mit diesem Attribut:

    • Es ist nicht erforderlich, dass der Benutzer Zeitinformationen in das Datumsfeld eingibt.
    • Nur das Datum wird angezeigt, keine Zeitinformationen.

DataAnnotations werden in einem späteren Tutorial behandelt.

DataAnnotations werden in einem späteren Tutorial behandelt.

Erstellen Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler vorliegen.

Erstellen des Gerüsts für das Filmmodell

In diesem Abschnitt wird das Gerüst für das Filmmodell erstellt. Mit dem Tool für den Gerüstbau werden Seiten für die Vorgänge „Create“ (Erstellen), „Read“ (Lesen), „Update“ (Aktualisieren) und „Delete“ (Löschen), kurz CRUD-Vorgänge, für das Filmmodell erstellt.

Erstellen Sie den Ordner Pages/Movies:

  • Klicken Sie mit der rechten Maustaste auf den Ordner Pages>Hinzufügen>Neuer Ordner.
  • Nennen Sie den Ordner Movies.

Klicken Sie mit der rechten Maustaste auf den Ordner Pages/Movies>Hinzufügen>Neues Gerüstelement.

Neues Gerüstelement in VScode

Wählen Sie im Dialogfeld Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.

Hinzufügen eines Gerüsts in VScode

Vervollständigen Sie das Dialogfeld Add Razor Pages using Entity Framework (CRUD) (Razor-Seiten mithilfe des Entity Frameworks (CRUD) hinzufügen):

  • Wählen Sie in der Dropdownliste Modellklasse den Eintrag Film (RazorPagesMovie.Models) aus.
  • Klicken Sie in der Zeile Datenkontextklasse auf das Pluszeichen +, und ändern Sie den generierten Namen von RazorPagesMovie.Models.RazorPagesMovieContext in RazorPagesMovie.Data.RazorPagesMovieContext. Dieses Änderung ist nicht erforderlich. Sie erstellt die Datenbank-Kontextklasse mit dem korrekten Namespace.
  • Wählen Sie Hinzufügen.

Hinzufügen von Razor Pages in VSCode

Die Datei appsettings.json wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.

Erstellte Dateien

Der Gerüstprozess erstellt und ändert folgende Dateien:

  • Pages/Movies: „Create“, „Delete“, „Details“, „Edit“ und „Index“.
  • Data/RazorPagesMovieContext.cs

Aktualisiert

  • Startup.cs

Die erstellten und aktualisierten Daten werden im nächsten Abschnitt erläutert.

Anfängliche Migration

In diesem Abschnitt wird die Paket-Manager-Konsole (Package Manager Console, PMC) für Folgendes verwendet:

  • Fügen Sie eine anfängliche Migration hinzu.
  • Aktualisieren Sie die Datenbank mit der anfänglichen Migration.

Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.

PMC-Menü

Geben Sie in der PMC die folgenden Befehle ein:

Add-Migration InitialCreate
Update-Database

Mit den vorherigen Befehlen wird die folgende Warnung erstellt: "No type was specified for the decimal column 'Price' on entity type 'Movie'. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'." („Für die Spalte „Price“ mit Dezimalwerten beim Entitätstyp „Movie“ wurde kein Typ angegeben. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Geben Sie den Spaltentyp von SQL-Server an, der durch „ForHasColumnType()“ sämtliche Werte unterstützen kann.")

Ignorieren Sie die Warnung, da sie in einem späteren Schritt behandelt wird.

Mit dem Migrationsbefehl wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das in DbContext angegeben ist. Das Argument InitialCreate wird verwendet, um die Migrationen zu benennen. Es kann jeder Name verwendet werden, aber per Konvention wird ein Name ausgewählt, der die Migration beschreibt.

Der update-Befehl führt die Up-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt update die Up-Methode in der Datei Migrations/<time-stamp>_InitialCreate.cs aus, mit der die Datenbank erstellt wird.

Überprüfen des mit Dependency Injection registrierten Kontexts

ASP.NET Core wird mit Dependency Injection erstellt. Dienste wie der EF Core-Datenbankkontext werden per Dependency Injection beim Anwendungsstart registriert. Komponenten, die diese Dienste erfordern (z. B. Razor Pages), werden diese Dienste über Konstruktorparameter bereitgestellt. Der Konstruktorcode, der eine Datenbankkontextinstanz abruft, wird später in diesem Tutorial erläutert.

Das Tool für den Gerüstbau hat automatisch einen Datenbankkontext erstellt und diesen beim Dependency Injection-Container registriert.

Untersuchen Sie die Methode Startup.ConfigureServices. Die hervorgehobene Zeile wurde vom Gerüst hinzugefügt:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Der RazorPagesMovieContext koordiniert die EF Core-Funktionen (Create, Read, Update und Delete) für das Movie-Modell. Der Datenkontext (RazorPagesMovieContext) wird aus Microsoft.EntityFrameworkCore.DbContext abgeleitet. Der Datenkontext gibt an, welche Entitäten im Datenmodell enthalten sind.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Der vorangehende Code erstellt eine DbSet<Movie>-Eigenschaft für die Entitätenmenge. In der Terminologie von Entity Framework entspricht eine Entitätenmenge in der Regel einer Datenbanktabelle. Entitäten entsprechen Zeilen in Tabellen.

Der Name der Verbindungszeichenfolge wird an den Kontext übergeben, indem Sie eine Methode auf einem DbContextOptions-Objekt aufrufen. Für die lokale Entwicklung liest das -Konfigurationssystem die Verbindungszeichenfolge aus der Datei appsettings.json.

Testen der App

  • Führen Sie die App aus, und fügen Sie /Movies an die URL im Browser an (http://localhost:port/movies).

Wenn Sie eine Fehlermeldung erhalten, müssen Sie Folgendes tun:

SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.

Sie haben den Migrationsschritt verpasst.

  • Testen Sie den Link Create (Erstellen).

    Seite „Create“

    Hinweis

    Sie können unter Umständen in das Feld Price keine Kommas als Dezimaltrennzeichen eingeben. Zur Unterstützung der jQuery-Validierung für Gebietsschemas mit einer anderen Sprache als Englisch, in denen ein Komma („,“) als Dezimaltrennzeichen verwendet wird, und für Datums- und Uhrzeitformate, die nicht dem US-englischen Format entsprechen, muss die App globalisiert werden. Globalisierungsanweisungen finden Sie unter GitHub-Problem.

  • Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen).

Im nächsten Tutorial finden Sie Erläuterungen zu den Dateien, die durch den Gerüstbau erstellt wurden.

Nächste Schritte