Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Note
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
Warning
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der .NET- und .NET Core-Supportrichtlinie. Die aktuelle Version finden Sie in der .NET 10-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. Registrieren Sie den Datenbankkontext mit dem Dependency Injection-Container in Program.cs:
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 ConnectionString-Schlüssel. Bei der lokalen Entwicklung ruft die Konfiguration die Verbindungszeichenfolge aus der appsettings.json Datei ab.
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"
}
}
Warning
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 einfache Version des SQL Server Express-Datenbankmoduls, das für die Programmentwicklung entwickelt wurde. LocalDB wird bedarfsgesteuert gestartet und im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt. Standardmäßig erstellt *.mdf LocalDB Datenbankdateien im C:\Users\<user>\ Verzeichnis.
Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).
Klicken Sie mit der rechten Maustaste auf die
MovieTabelle, und wählen SieMovieaus:
Beachten Sie das Schlüsselsymbol neben
ID. EF erstellt standardmäßig eine Eigenschaft namensIDfür den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die
MovieTabelle und wählen SieMovieaus:
Datenbank befüllen
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 die Datenbank Filme enthält, gibt der Seed-Initializer zurück und fügt keine Filme hinzu.
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 ändern Sie Program.cs, um die folgenden Schritte auszuführen:
- Erstellen Sie einen Dienstbereich mit
app.Services.CreateScope(). - Rufen Sie den Dienstanbieter (IServiceProvider) aus dem Scope ab.
- Rufen Sie die
SeedData.InitializeMethode auf, und übergeben Sie den Dienstanbieter. - Verwerfen Sie den Dienstbereich, wenn die Seed-Methode abgeschlossen ist. Die
usingAnweisung stellt sicher, dass der Gültigkeitsbereich freigegeben wird.
Die folgende Ausnahme tritt auf, wenn Sie nicht ausführen Update-Database:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Teste die 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 die Datenbank nicht initialisiert wird, setzen Sie an if (context.Movie.Any()) einen Breakpoint und gehen Sie den Code schrittweise durch.
Die App zeigt die durch Seeding eingefü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 im Container für Abhängigkeitsinjektion 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 appsettings.json-Datei 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"
}
}
Warning
Dieser Artikel verwendet eine lokale Datenbank, ohne dass der Benutzer authentifiziert sein muss. 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 leichtgewichtige Version 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 SieMovieaus:
Beachten Sie das Schlüsselsymbol neben
ID. EF erstellt standardmäßig eine Eigenschaft namensIDfür den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die Tabelle
Movieund wählen SieMovieaus:
Datenbank befüllen
Erstellen Sie im Ordner SeedData die neue Klasse SeedData mit dem folgenden Code:
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, kehrt der Seed-Initialisierer zurück, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Seed-Initialisierer hinzufügen
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:
- Erstellen Sie einen Dienstbereich mit
app.Services.CreateScope(). - Rufen Sie den Dienstanbieter (IServiceProvider) aus dem Bereich ab.
- Rufen Sie die
SeedData.InitializeMethode auf, und übergeben Sie sie an den Dienstanbieter. - Geben Sie den Dienstbereich frei, wenn die Seed-Methode abgeschlossen ist. Die
usingAnweisung stellt sicher, dass der Gültigkeitsbereich freigegeben wird.
Die folgende Ausnahme tritt auf, wenn Update-Database nicht ausgeführt worden ist:
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 im Container für die Abhängigkeitsinjektion 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 appsettings.json-Datei 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"
}
}
Warning
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 leichtgewichtige Version 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
MovieTabelle, und wählen SieMovieaus:
Beachten Sie das Schlüsselsymbol neben
ID. EF erstellt standardmäßig eine Eigenschaft namensIDfür den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die
MovieTabelle, und wählen SieMovieaus:
Datenbank befüllen
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, kehrt der Seed-Initialisierer zurück, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Seed-Initialisierer hinzufügen
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:
- Erstellen Sie einen Dienstumfang mit
app.Services.CreateScope(). - Rufen Sie den Dienstanbieter (IServiceProvider) aus dem Bereich ab.
- Rufen Sie die
SeedData.InitializeMethode auf, und übergeben Sie ihr den Dienstanbieter. - Geben Sie den Dienstscope frei, sobald die Seed-Methode abgeschlossen ist. Die
usingusing-Anweisung stellt sicher, dass der Gültigkeitsbereich freigegeben wird.
Die folgende Ausnahme tritt auf, wenn Update-Database nicht ausgeführt worden ist:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Teste die 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 die Datenbank nicht mit Seed-Daten initialisiert wurde, 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 appsettings.json-Datei 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"
}
}
Warning
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 leichtgewichtige Version der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung bestimmt ist. LocalDB wird bei Bedarf gestartet und läuft im Benutzermodus, sodass keine komplexe Konfiguration erforderlich ist. 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 SieMovieaus:
Beachten Sie das Schlüsselsymbol neben
ID. EF erstellt standardmäßig eine Eigenschaft namensIDfür den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die
MovieTabelle, und wählen SieMovieaus:
Datenbank befüllen
Erstellen Sie im Ordner SeedData die neue Klasse SeedData mit dem folgenden Code:
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, kehrt der Seed-Initialisierer zurück, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Seed-Initialisierer hinzufügen
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 ihr die Instanz des Datenbankkontexts. - Geben Sie den Kontext frei, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext freigegeben 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'.
Teste die App
Löschen Sie alle Datensätze in der Datenbank, damit die seed-Methode ausgeführt wird. Beenden und starten Sie die App, um die Datenbank zu initialisieren. Wenn die Datenbank nicht initialisiert ist, 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 im 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"
}
}
Warning
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
MovieTabelle, und wählen SieMovieaus:
Beachten Sie das Schlüsselsymbol neben
ID. EF erstellt standardmäßig eine Eigenschaft namensIDfür den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die Tabelle
Movie, und wählen SieMovieaus:
Datenbank befüllen
Erstellen Sie im Ordner SeedData eine neue Klasse namens SeedData mit dem folgenden Code:
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;
}
Seed-Initialisierer hinzufügen
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 ihr die Datenbankkontextinstanz. - Geben Sie den Kontext frei, 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'.
Teste die 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, eine Verbindung zur Datenbank herzustellen und Movie-Objekte Datenbankdatensätzen zuzuordnen. Der Datenbankkontext wird in der ConfigureServices-Methode in Startup.cs beim Container für Abhängigkeitsinjektion 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"
}
}
Warning
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 Authentifizierungsabläufe.
SQL Server Express LocalDB
LocalDB ist eine leichtgewichtige Version der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung bestimmt ist. LocalDB wird bei Bedarf gestartet und läuft im Benutzermodus, sodass keine komplexe Konfiguration erforderlich ist. Standardmäßig erstellt die LocalDB-Datenbank *.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
MovieTabelle, und wählen SieMovieaus:
Beachten Sie das Schlüsselsymbol neben
ID. EF erstellt standardmäßig eine Eigenschaft namensIDfür den Primärschlüssel.Klicken Sie mit der rechten Maustaste auf die Tabelle
Movieund wählen SieMovieaus:
Datenbank befüllen
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, beendet der Seed-Initialisierer die Ausführung, und es werden keine Filme hinzugefügt.
if (context.Movie.Any())
{
return;
}
Seed-Initialisierer hinzufügen
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 ihr die Instanz mit dem Datenbankkontext. - Geben Sie den Kontext frei, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext freigegeben 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'.
Teste die App
Löschen Sie alle Datensätze in der Datenbank. Verwenden Sie die Links „Löschen“ im Browser oder von SSOX aus.
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. Beenden und starten Sie IIS mit einer der folgenden Methoden neu:Klicken Sie im Infobereich der Taskleiste mit der rechten Maustaste auf das IIS-Express-Symbol, und wählen Sie Beenden oder Website stoppen aus:
Wenn die App im Nicht-Debugmodus ausgeführt wird, drücken Sie F5, um sie im Debugmodus zu starten.
Wenn sich die App im Debugmodus befindet, 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 mit dem 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 bezieht die Konfiguration die Verbindungszeichenfolge aus der Datei appsettings.json.
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"
}
}
Warning
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 leichtgewichtige Version 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. Die LocalDB-Datenbank erstellt standardmäßig *.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 SieMovieaus:
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
MovieTabelle und wählen SieMovieaus:
Datenbank befüllen
Erstellen Sie im Ordner SeedData eine neue Klasse namens SeedData mit dem folgenden Code:
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;
}
Seed-Initialisierer hinzufügen
Ersetzen Sie den Inhalt von 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 ihr die Datenbankkontextinstanz. - Geben Sie den Kontext frei, wenn die Seedmethode abgeschlossen ist. Die using-Anweisung stellt sicher, dass der Kontext freigegeben 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. Verwenden Sie die Links „Löschen“ im Browser oder in SSOX.
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 sich die App im Debugmodus befindet, beenden Sie den Debugger, und drücken Sie F5.
Die App zeigt die Seed-Daten: