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.

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.")));

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:

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

Wenn die App auf einem Test- oder Produktionsserver bereitgestellt wird, kann eine Umgebungsvariable verwendet werden, um die Verbindungszeichenfolge auf einen echten Datenbankserver für Tests oder die Produktion festzulegen. Weitere Informationen finden Sie unter Konfiguration.

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.

  1. Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).

    Menü Ansicht

  2. Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Für die Tabelle „Movie“ geöffnetes Kontextmenüs

    Im Designer geöffnete Tabellen „Movie“

    Beachten Sie das Schlüsselsymbol neben ID. EF erstellt standardmäßig eine Eigenschaft namens ID für den Primärschlüssel.

  3. Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Geöffnete Tabelle „Movie“ mit Tabellendaten

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:

Im Browser geöffnete Movie-Anwendung mit Filmdaten

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:

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

Wenn die App auf einem Test- oder Produktionsserver bereitgestellt wird, kann eine Umgebungsvariable verwendet werden, um die Verbindungszeichenfolge auf einen echten Datenbankserver für Tests oder die Produktion festzulegen. Weitere Informationen finden Sie unter Konfiguration.

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.

  1. Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).

    Menü Ansicht

  2. Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Für die Tabelle „Movie“ geöffnetes Kontextmenüs

    Im Designer geöffnete Tabellen „Movie“

    Beachten Sie das Schlüsselsymbol neben ID. EF erstellt standardmäßig eine Eigenschaft namens ID für den Primärschlüssel.

  3. Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Geöffnete Tabelle „Movie“ mit Tabellendaten

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:

Im Browser geöffnete Movie-Anwendung mit Filmdaten

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:

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

Wenn die App auf einem Test- oder Produktionsserver bereitgestellt wird, kann eine Umgebungsvariable verwendet werden, um die Verbindungszeichenfolge auf einen echten Datenbankserver für Tests oder die Produktion festzulegen. Weitere Informationen finden Sie unter Konfiguration.

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.

  1. Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).

    Menü Ansicht

  2. Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Für die Tabelle „Movie“ geöffnetes Kontextmenüs

    Im Designer geöffnete Tabellen „Movie“

    Beachten Sie das Schlüsselsymbol neben ID. EF erstellt standardmäßig eine Eigenschaft namens ID für den Primärschlüssel.

  3. Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Geöffnete Tabelle „Movie“ mit Tabellendaten

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:

Im Browser geöffnete Movie-Anwendung mit Filmdaten

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:

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

Wenn die App auf einem Test- oder Produktionsserver bereitgestellt wird, kann eine Umgebungsvariable verwendet werden, um die Verbindungszeichenfolge auf einen echten Datenbankserver für Tests oder die Produktion festzulegen. Weitere Informationen finden Sie unter Konfiguration.

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.

  1. Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).

    Menü Ansicht

  2. Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Für die Tabelle „Movie“ geöffnetes Kontextmenüs

    Im Designer geöffnete Tabellen „Movie“

    Beachten Sie das Schlüsselsymbol neben ID. EF erstellt standardmäßig eine Eigenschaft namens ID für den Primärschlüssel.

  3. Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Geöffnete Tabelle „Movie“ mit Tabellendaten

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

  1. Löschen Sie alle Datensätze in der Datenbank. Dies ist über die Links „Löschen“ im Browser oder SSOX möglich.

  2. 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:

    1. 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:

      IIS Express-Symbol auf der Taskleiste

      Kontextmenü

    2. Wenn die App nicht im Debugmodus ausgeführt wird, drücken Sie F5, um sie im Debugmodus auszuführen.

    3. 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:

Im Browser geöffnete Movie-Anwendung mit Filmdaten

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"
  }
}

Wenn die App auf einem Test- oder Produktionsserver bereitgestellt wird, kann eine Umgebungsvariable verwendet werden, um die Verbindungszeichenfolge auf einen echten Datenbankserver für Tests oder die Produktion festzulegen. Weitere Informationen finden Sie unter Konfiguration.

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).

    Menü Ansicht

  • Klicken Sie mit der rechten Maustaste auf die Tabelle Movie, und wählen Sie Movie aus:

    Für die Tabelle „Movie“ geöffnetes Kontextmenüs

    Im Designer geöffnete Tabellen „Movie“

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 Sie Movie aus:

    Geöffnete Tabelle „Movie“ mit Tabellendaten

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:

      IIS Express-Symbol auf der Taskleiste

      Kontextmenü

      • 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:

In Chrome geöffnete Movie-Anwendung mit Filmdaten

Nächste Schritte