Dies ist Teil 4 der Tutorialreihe zu Razor Pages.
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.
Von Joe Audette
Das RazorPagesMovieContext
-Objekt übernimmt die Aufgabe der Herstellung der Verbindung mit der Datenbank und Zuordnung von Movie
-Objekten zu Datensätzen in der Datenbank. Der Datenbankkontext wird beim Dependency Injection-Container in Program.cs
registriert:
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.")));
Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString
. Für die lokale Entwicklung wird für die Konfiguration die Verbindungszeichenfolge aus der Datei appsettings.json
abgerufen.
Die generierte Verbindungszeichenfolge ähnelt dem folgenden JSON-Code:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB ist eine Basisversion der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung bestimmt ist. LocalDB wird bedarfsgesteuert gestartet und im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt. Standardmäßig erstellt LocalDB *.mdf
-Dateien im C:\Users\<user>\
-Verzeichnis.
Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).
Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:Beachten Sie das Schlüsselsymbol neben
ID
. EF erstellt standardmäßig eine Eigenschaft namensID
für den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:
Ausführen eines Seedings für die Datenbank
Erstellen Sie im Ordner SeedData
mit dem folgenden Code die neue Klasse SeedData
:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Wenn in der Datenbank Filme vorhanden sind, wird der Initialisierer des Seedings zurückgegeben, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Hinzufügen des Initialisierers des Seedings
Aktualisieren Sie Program.cs
mit dem folgenden hervorgehobenen Code:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
Im vorherigen Code wurde Program.cs
folgendermaßen geändert:
- Rufen Sie eine Datenbankkontextinstanz aus dem DI-Container (Dependency Injection) ab.
- Rufen Sie die
seedData.Initialize
-Methode auf, und übergeben Sie sie an die Instanz mit dem Datenbankkontext. - Löschen Sie den Kontext, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext verworfen wird.
Die folgende Ausnahme tritt auf, wenn Update-Database
nicht ausgeführt wurde:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testen der App
Löschen Sie alle Datensätze in der Datenbank, damit die seed-Methode ausgeführt wird. Beenden und starten Sie die App, um das Seeding der Datenbank auszuführen. Wenn für die Datenbank kein Seeding ausgeführt wird, setzen Sie einen Breakpoint bei if (context.Movie.Any())
, und führen Sie den Code in Einzelschritten aus.
Die App zeigt die per Seeding hinzugefügten Daten:
Nächste Schritte
Das RazorPagesMovieContext
-Objekt übernimmt die Aufgabe der Herstellung der Verbindung mit der Datenbank und Zuordnung von Movie
-Objekten zu Datensätzen in der Datenbank. Der Datenbankkontext wird beim Dependency Injection-Container in Program.cs
registriert:
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();
Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString
. Für die lokale Entwicklung wird für die Konfiguration die Verbindungszeichenfolge aus der Datei appsettings.json
abgerufen.
Die generierte Verbindungszeichenfolge ähnelt dem folgenden JSON-Code:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB ist eine Basisversion der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung bestimmt ist. LocalDB wird bedarfsgesteuert gestartet und im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt. Standardmäßig erstellt LocalDB *.mdf
-Dateien im C:\Users\<user>\
-Verzeichnis.
Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).
Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:Beachten Sie das Schlüsselsymbol neben
ID
. EF erstellt standardmäßig eine Eigenschaft namensID
für den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:
Ausführen eines Seedings für die Datenbank
Erstellen Sie im Ordner SeedData
mit dem folgenden Code die neue Klasse SeedData
:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Wenn in der Datenbank Filme vorhanden sind, wird der Initialisierer des Seedings zurückgegeben, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Hinzufügen des Initialisierers des Seedings
Aktualisieren Sie Program.cs
mit dem folgenden hervorgehobenen Code:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Im vorherigen Code wurde Program.cs
folgendermaßen geändert:
- Rufen Sie eine Datenbankkontextinstanz aus dem DI-Container (Dependency Injection) ab.
- Rufen Sie die
seedData.Initialize
-Methode auf, und übergeben Sie sie an die Instanz mit dem Datenbankkontext. - Löschen Sie den Kontext, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext verworfen wird.
Die folgende Ausnahme tritt auf, wenn Update-Database
nicht ausgeführt wurde:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testen der App
Löschen Sie alle Datensätze in der Datenbank, damit die seed-Methode ausgeführt wird. Beenden und starten Sie die App, um das Seeding der Datenbank auszuführen. Wenn für die Datenbank kein Seeding ausgeführt wird, setzen Sie einen Breakpoint bei if (context.Movie.Any())
, und führen Sie den Code in Einzelschritten aus.
Die App zeigt die per Seeding hinzugefügten Daten:
Nächste Schritte
Das RazorPagesMovieContext
-Objekt übernimmt die Aufgabe der Herstellung der Verbindung mit der Datenbank und Zuordnung von Movie
-Objekten zu Datensätzen in der Datenbank. Der Datenbankkontext wird beim Dependency Injection-Container in Program.cs
registriert:
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();
Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString
. Für die lokale Entwicklung wird für die Konfiguration die Verbindungszeichenfolge aus der Datei appsettings.json
abgerufen.
Die generierte Verbindungszeichenfolge ähnelt dem folgenden JSON-Code:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB ist eine Basisversion der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung bestimmt ist. LocalDB wird bedarfsgesteuert gestartet und im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt. Standardmäßig erstellt LocalDB *.mdf
-Dateien im C:\Users\<user>\
-Verzeichnis.
Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).
Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:Beachten Sie das Schlüsselsymbol neben
ID
. EF erstellt standardmäßig eine Eigenschaft namensID
für den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:
Ausführen eines Seedings für die Datenbank
Erstellen Sie im Ordner SeedData
mit dem folgenden Code die neue Klasse SeedData
:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Wenn in der Datenbank Filme vorhanden sind, wird der Initialisierer des Seedings zurückgegeben, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Hinzufügen des Initialisierers des Seedings
Aktualisieren Sie Program.cs
mit dem folgenden hervorgehobenen Code:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Im vorherigen Code wurde Program.cs
folgendermaßen geändert:
- Rufen Sie eine Datenbankkontextinstanz aus dem DI-Container (Dependency Injection) ab.
- Rufen Sie die
seedData.Initialize
-Methode auf, und übergeben Sie sie an die Instanz mit dem Datenbankkontext. - Löschen Sie den Kontext, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext verworfen wird.
Die folgende Ausnahme tritt auf, wenn Update-Database
nicht ausgeführt wurde:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testen der App
Löschen Sie alle Datensätze in der Datenbank, damit die seed-Methode ausgeführt wird. Beenden und starten Sie die App, um das Seeding der Datenbank auszuführen. Wenn für die Datenbank kein Seeding ausgeführt wird, setzen Sie einen Breakpoint bei if (context.Movie.Any())
, und führen Sie den Code in Einzelschritten aus.
Die App zeigt die per Seeding hinzugefügten Daten:
Nächste Schritte
Das RazorPagesMovieContext
-Objekt übernimmt die Aufgabe der Herstellung der Verbindung mit der Datenbank und Zuordnung von Movie
-Objekten zu Datensätzen in der Datenbank. Der Datenbankkontext wird beim Dependency Injection-Container in Program.cs
registriert:
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();
Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString
. Für die lokale Entwicklung wird für die Konfiguration die Verbindungszeichenfolge aus der Datei appsettings.json
abgerufen.
Die generierte Verbindungszeichenfolge ähnelt dem folgenden JSON-Code:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB ist eine Basisversion der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung bestimmt ist. LocalDB wird bedarfsgesteuert gestartet und im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt. Standardmäßig erstellt LocalDB *.mdf
-Dateien im C:\Users\<user>\
-Verzeichnis.
Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).
Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:Beachten Sie das Schlüsselsymbol neben
ID
. EF erstellt standardmäßig eine Eigenschaft namensID
für den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:
Ausführen eines Seedings für die Datenbank
Erstellen Sie im Ordner SeedData
mit dem folgenden Code die neue Klasse SeedData
:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Wenn in der Datenbank Filme vorhanden sind, wird der Initialisierer des Seedings zurückgegeben, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Hinzufügen des Initialisierers des Seedings
Aktualisieren Sie Program.cs
mit dem folgenden hervorgehobenen Code:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Im vorherigen Code wurde Program.cs
folgendermaßen geändert:
- Rufen Sie eine Datenbankkontextinstanz aus dem DI-Container (Dependency Injection) ab.
- Rufen Sie die
seedData.Initialize
-Methode auf, und übergeben Sie sie an die Instanz mit dem Datenbankkontext. - Löschen Sie den Kontext, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext verworfen wird.
Die folgende Ausnahme tritt auf, wenn Update-Database
nicht ausgeführt wurde:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testen der App
Löschen Sie alle Datensätze in der Datenbank, damit die seed-Methode ausgeführt wird. Beenden und starten Sie die App, um das Seeding der Datenbank auszuführen. Wenn für die Datenbank kein Seeding ausgeführt wird, setzen Sie einen Breakpoint bei if (context.Movie.Any())
, und führen Sie den Code in Einzelschritten aus.
Die App zeigt die per Seeding hinzugefügten Daten:
Nächste Schritte
Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).
Das RazorPagesMovieContext
-Objekt übernimmt die Aufgabe der Herstellung der Verbindung mit der Datenbank und Zuordnung von Movie
-Objekten zu Datensätzen in der Datenbank. Der Datenbankkontext wird beim Dependency Injection-Container in der ConfigureServices
-Methode in Startup.cs
registriert:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString
. Für die lokale Entwicklung wird für die Konfiguration die Verbindungszeichenfolge aus der Datei appsettings.json
abgerufen.
Die generierte Verbindungszeichenfolge ähnelt dem folgenden JSON-Code:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB ist eine Basisversion der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung bestimmt ist. LocalDB wird bedarfsgesteuert gestartet und im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt. Standardmäßig erstellt LocalDB *.mdf
-Dateien im C:\Users\<user>\
-Verzeichnis.
Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).
Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:Beachten Sie das Schlüsselsymbol neben
ID
. EF erstellt standardmäßig eine Eigenschaft namensID
für den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:
Ausführen eines Seedings für die Datenbank
Erstellen Sie im Ordner SeedData
mit dem folgenden Code die neue Klasse SeedData
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Wenn in der Datenbank Filme vorhanden sind, wird der Initialisierer des Seedings zurückgegeben, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Hinzufügen des Initialisierers des Seedings
Ersetzen Sie den Inhalt der Datei Program.cs
durch den folgenden Code:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
namespace RazorPagesMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Im vorherigen Code wurde die Main
-Methode geändert, um Folgendes durchzuführen:
- Rufen Sie eine Datenbankkontextinstanz aus dem Dependency Injection-Container ab.
- Rufen Sie die
seedData.Initialize
-Methode auf, und übergeben Sie sie an die Instanz mit dem Datenbankkontext. - Löschen Sie den Kontext, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext verworfen wird.
Die folgende Ausnahme tritt auf, wenn Update-Database
nicht ausgeführt wurde:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testen der App
Löschen Sie alle Datensätze in der Datenbank. Dies ist über die Links „Löschen“ im Browser oder SSOX möglich.
Zwingen Sie die App zur Initialisierung (rufen Sie dazu die Methoden in der
Startup
-Klasse auf), damit die Seed-Methode ausgeführt wird. Um die Initialisierung zu erzwingen, muss IIS Express beendet und neu gestartet werden. Sie müssen IIS mit einer der folgenden Vorgehensweisen beenden und neu starten:Klicken Sie auf der Taskleiste im Infobereich mit der rechten Maustaste auf das Symbol von IIS Express, und wählen Sie Beenden oder Website beenden aus:
Wenn die App nicht im Debugmodus ausgeführt wird, drücken Sie F5, um sie im Debugmodus auszuführen.
Wenn die App im Debugmodus ausgeführt wird, beenden Sie den Debugger, und drücken Sie F5.
Die App zeigt die per Seeding hinzugefügten Daten:
Nächste Schritte
Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).
Das RazorPagesMovieContext
-Objekt übernimmt die Aufgabe der Herstellung der Verbindung mit der Datenbank und Zuordnung von Movie
-Objekten zu Datensätzen in der Datenbank. Der Datenbankkontext wird beim Dependency Injection-Container in der ConfigureServices
-Methode in Startup.cs
registriert:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString
. Für die lokale Entwicklung wird für die Konfiguration die Verbindungszeichenfolge aus der Datei appsettings.json
abgerufen.
Die generierte Verbindungszeichenfolge sieht in etwa wie folgt aus:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB ist eine Basisversion der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung bestimmt ist. LocalDB wird bedarfsgesteuert gestartet und im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt. Standardmäßig erstellt LocalDB *.mdf
-Dateien im C:\Users\<user>\
-Verzeichnis.
Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).
Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:
Beachten Sie das Schlüsselsymbol neben ID
. EF erstellt standardmäßig eine Eigenschaft namens ID
für den Primärschlüssel.
Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie
, und wählen SieMovie
aus:
Ausführen eines Seedings für die Datenbank
Erstellen Sie im Ordner SeedData
mit dem folgenden Code die neue Klasse SeedData
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Wenn in der Datenbank Filme vorhanden sind, wird der Initialisierer des Seedings zurückgegeben, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Hinzufügen des Initialisierers des Seedings
Ersetzen Sie den Inhalt der Datei Program.cs
durch den folgenden Code:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
namespace RazorPagesMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Im vorherigen Code wurde die Main
-Methode geändert, um Folgendes durchzuführen:
- Rufen Sie eine Datenbankkontextinstanz aus dem Dependency Injection-Container ab.
- Rufen Sie die
seedData.Initialize
-Methode auf, und übergeben Sie sie an die Instanz mit dem Datenbankkontext. - Löschen Sie den Kontext, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext verworfen wird.
Die folgende Ausnahme tritt auf, wenn Update-Database
nicht ausgeführt wurde:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testen der App
Löschen Sie alle Datensätze in der Datenbank. Dies ist über die Links „Löschen“ im Browser oder SSOX möglich.
Zwingen Sie die App zur Initialisierung (rufen Sie dazu die Methoden in der
Startup
-Klasse auf), damit die Seed-Methode ausgeführt wird. Um die Initialisierung zu erzwingen, muss IIS Express beendet und neu gestartet werden. Sie müssen IIS mit einer der folgenden Vorgehensweisen beenden und neu starten:Klicken Sie auf der Taskleiste im Infobereich mit der rechten Maustaste auf das Symbol von IIS Express, und wählen Sie Beenden oder Website beenden aus:
- Wenn die App nicht im Debugmodus ausgeführt wird, drücken Sie F5, um sie im Debugmodus auszuführen.
- Wenn die App im Debugmodus ausgeführt wird, beenden Sie den Debugger, und drücken Sie F5.
Die App zeigt die per Seeding hinzugefügten Daten: