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.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. 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
Klicken Sie im Solution Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen
Models
anmelden.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.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.
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.
Wählen Sie im Dialogfeld Neues Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.
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.
- Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
RazorPagesMovie.Data.RazorPagesMovieContext
generiert. - Wählen Sie in der Dropdownliste Datenbankanbieter die Option SQL Server aus.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
- Wählen Sie Hinzufügen.
Die Datei appsettings.json
wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.
Warnung
In diesem Artikel wird eine lokale Datenbank verwendet, für die keine Authentifizierung des Benutzers erforderlich ist. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für bereitgestellte Test- und Produktions-Apps finden Sie unter Sichere Authentifizierungsflows.
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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
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.
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.
Geben Sie in der PMC den folgenden Befehl ein:
Add-Migration InitialCreate
Mit dem Befehl
Add-Migration
wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das inDbContext
angegeben ist. Das ArgumentInitialCreate
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.
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.)
Geben Sie in der PMC den folgenden Befehl ein:
Update-Database
Der
Update-Database
-Befehl führt dieUp
-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt der Befehl dieUp
-Methode in der DateiMigrations/<time-stamp>_InitialCreate.cs
aus, mit der die Datenbank erstellt wird.
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.
Die Klasse RazorPagesMovieContext
in der generierten Datei Data/RazorPagesMovieContext.cs
:
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
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.
Testen Sie den Link Neu erstellen.
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.
Ü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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
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
Klicken Sie im Solution Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen
Models
anmelden.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.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.
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.
Wählen Sie im Dialogfeld Neues Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.
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.
- Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
RazorPagesMovie.Data.RazorPagesMovieContext
generiert. - Wählen Sie in der Dropdownliste Datenbankanbieter die Option SQL Server aus.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
- Wählen Sie Hinzufügen.
Die Datei appsettings.json
wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.
Warnung
In diesem Artikel wird eine lokale Datenbank verwendet, für die keine Authentifizierung des Benutzers erforderlich ist. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für bereitgestellte Test- und Produktions-Apps finden Sie unter Sichere Authentifizierungsflows.
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.
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.
Geben Sie in der PMC den folgenden Befehl ein:
Add-Migration InitialCreate
Mit dem Befehl
Add-Migration
wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das inDbContext
angegeben ist. Das ArgumentInitialCreate
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.
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.)
Geben Sie in der PMC den folgenden Befehl ein:
Update-Database
Der
Update-Database
-Befehl führt dieUp
-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt der Befehl dieUp
-Methode in der DateiMigrations/<time-stamp>_InitialCreate.cs
aus, mit der die Datenbank erstellt wird.
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
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.
Testen Sie den Link Neu erstellen.
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.
Ü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
Klicken Sie im Solution Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen
Models
anmelden.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.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.
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.
Wählen Sie im Dialogfeld Neues Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.
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.
- Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
RazorPagesMovie.Data.RazorPagesMovieContext
generiert. - Wählen Sie in der Dropdownliste Datenbankanbieter die Option SQL Server aus.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
- Wählen Sie Hinzufügen.
Die Datei appsettings.json
wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.
Warnung
In diesem Artikel wird eine lokale Datenbank verwendet, für die keine Authentifizierung des Benutzers erforderlich ist. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für bereitgestellte Test- und Produktions-Apps finden Sie unter Sichere Authentifizierungsflows.
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.
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.
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 inDbContext
angegeben ist. Das ArgumentInitialCreate
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 dieUp
-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt der Befehl dieUp
-Methode in der DateiMigrations/<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
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.
Testen Sie den Link Neu erstellen.
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.
Ü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
Klicken Sie im Solution Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen
Models
anmelden.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.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.
Fügen Sie das NuGet Paket
Microsoft.EntityFrameworkCore.Design
hinzu, das für das Gerüstbautool erforderlich ist.- Wählen Sie im Menü Extras die Option NuGet-Paket-Manager>NuGet-Pakete für Projektmappe verwalten aus.
- Wählen Sie die Registerkarte Durchsuchen aus.
- Geben Sie
Microsoft.EntityFrameworkCore.Design
ein, und wählen Sie diese Option aus der Liste aus. - Aktivieren Sie Projekt, und wählen Sie dann Installieren aus.
- Wählen Sie im Dialogfeld Zustimmung zur Lizenz die Option Annehmen aus.
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.
Wählen Sie im Dialogfeld Neues Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.
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.
- Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
RazorPagesMovie.Data.RazorPagesMovieContext
generiert.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
- Wählen Sie Hinzufügen.
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.
Warnung
In diesem Artikel wird eine lokale Datenbank verwendet, für die keine Authentifizierung des Benutzers erforderlich ist. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für bereitgestellte Test- und Produktions-Apps finden Sie unter Sichere Authentifizierungsflows.
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.
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.
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
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.
Testen Sie den Link Neu erstellen.
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.
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
Klicken Sie im Solution Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen
Models
anmelden.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 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.
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.
Wählen Sie im Dialogfeld Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.
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.
- Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
RazorPagesMovie.Data.RazorPagesMovieContext
generiert.
- Im Dialogfeld Datenkontext hinzufügen wird der Klassenname
- Wählen Sie Hinzufügen.
Die Datei appsettings.json
wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.
Warnung
In diesem Artikel wird eine lokale Datenbank verwendet, für die keine Authentifizierung des Benutzers erforderlich ist. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für bereitgestellte Test- und Produktions-Apps finden Sie unter Sichere Authentifizierungsflows.
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.
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager>Paket-Manager-Konsole aus.
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
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.
Testen Sie den Link Create (Erstellen).
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).
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).
Warnung
In diesem Artikel wird eine lokale Datenbank verwendet, für die keine Authentifizierung des Benutzers erforderlich ist. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für bereitgestellte Test- und Produktions-Apps finden Sie unter Sichere Authentifizierungsflows.
Hinzufügen eines Datenmodells
Klicken Sie mit der rechten Maustaste auf das Projekt RazorPagesMovie >Hinzufügen>Neuer Ordner. Geben Sie dem Ordner den Namen Models
anmelden.
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.
Wählen Sie im Dialogfeld Gerüst hinzufügen den Eintrag Razor Pages mit Entity Framework (CRUD)>Hinzufügen aus.
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.
- Wählen Sie in der Zeile Datenkontextklasse das Zeichen + (plus) aus 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.
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.
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).
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.