Teilen über


Teil 5: Arbeiten mit einer Datenbank in einer ASP.NET Core MVC-App

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 Rick Anderson und Jon P. Smith.

Das MvcMovieContext-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 Datei Program.cs registriert:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString. Für die lokale Entwicklung wird die Verbindungszeichenfolge aus der Datei appsettings.json abgerufen:

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;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 einfache Version der SQL Server Express-Datenbank-Engine, die standardmäßig mit Visual Studio installiert wird.
  • Wird bedarfsgesteuert über eine Verbindungszeichenfolge gestartet.
  • Ist für die Programmentwicklung ausgerichtet. Wird im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt.
  • Erstellt standardmäßig MDF-Dateien im Verzeichnis C:/Benutzer/{Benutzer} .

Untersuchen der Datenbank

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

Klicken Sie mit der rechten Maustaste auf die Tabelle Movie (dbo.Movie), und wählen Sie Ansichts-Designer aus.

Klicken mit der rechten Maustaste auf die Tabelle „Movie“ > „Ansichts-Designer“

Im Designer geöffnete Tabelle „Movie“

Beachten Sie das Schlüsselsymbol neben ID. EF macht die Eigenschaft mit dem Namen ID standardmäßig zum Primärschlüssel.

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

Klicken mit der rechten Maustaste auf die Tabelle „Movie“ > „Daten anzeigen“

Geöffnete Tabelle „Movie“ mit Tabellendaten

Ausführen eines Seedings für die Datenbank

Erstellen Sie im Ordner SeedData die neue Klasse SeedData. Ersetzen Sie den generierten Code durch den folgenden:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // 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;  // DB has been seeded.
}

Hinzufügen des Initialisierers des Seedings

Ersetzen Sie den Inhalt von Program.cs durch den folgenden Code. Der neue Code ist hervorgehoben.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

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

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

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

Testen der App. Erzwingen Sie die Initialisierung der App, indem Sie den Code in der Datei Program.cs aufrufen, damit die Seed-Methode ausgeführt wird. Um die Initialisierung zu erzwingen, schließen Sie das Eingabeaufforderungsfenster, das Visual Studio geöffnet hat, und starten Sie es über STRG+F5 neu.

Die App zeigt die per Seeding hinzugefügten Daten.

In Microsoft Edge geöffnete MVC Movie-App mit Filmdaten

Das MvcMovieContext-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 Datei Program.cs registriert:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString. Für die lokale Entwicklung wird die Verbindungszeichenfolge aus der Datei appsettings.json abgerufen:

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

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 einfache Version der SQL Server Express-Datenbank-Engine, die standardmäßig mit Visual Studio installiert wird.
  • Wird bedarfsgesteuert über eine Verbindungszeichenfolge gestartet.
  • Ist für die Programmentwicklung ausgerichtet. Wird im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt.
  • Erstellt standardmäßig MDF-Dateien im Verzeichnis C:/Benutzer/{Benutzer} .

Untersuchen der Datenbank

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

Klicken Sie mit der rechten Maustaste auf die Tabelle Movie (dbo.Movie), und wählen Sie Ansichts-Designer aus.

Klicken mit der rechten Maustaste auf die Tabelle „Movie“ > „Ansichts-Designer“

Im Designer geöffnete Tabelle „Movie“

Beachten Sie das Schlüsselsymbol neben ID. EF macht die Eigenschaft mit dem Namen ID standardmäßig zum Primärschlüssel.

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

Klicken mit der rechten Maustaste auf die Tabelle „Movie“ > „Daten anzeigen“

Geöffnete Tabelle „Movie“ mit Tabellendaten

Ausführen eines Seedings für die Datenbank

Erstellen Sie im Ordner SeedData die neue Klasse SeedData. Ersetzen Sie den generierten Code durch den folgenden:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // 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;  // DB has been seeded.
}

Hinzufügen des Initialisierers des Seedings

Ersetzen Sie den Inhalt von Program.cs durch den folgenden Code. Der neue Code ist hervorgehoben.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

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

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

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

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

Testen der App. Erzwingen Sie die Initialisierung der App, indem Sie den Code in der Datei Program.cs aufrufen, damit die Seed-Methode ausgeführt wird. Um die Initialisierung zu erzwingen, schließen Sie das Eingabeaufforderungsfenster, das Visual Studio geöffnet hat, und starten Sie es über STRG+F5 neu.

Die App zeigt die per Seeding hinzugefügten Daten.

In Microsoft Edge geöffnete MVC Movie-App mit Filmdaten

Das MvcMovieContext-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 Datei Program.cs registriert:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString. Für die lokale Entwicklung wird die Verbindungszeichenfolge aus der Datei appsettings.json abgerufen:

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

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 einfache Version der SQL Server Express-Datenbank-Engine, die standardmäßig mit Visual Studio installiert wird.
  • Wird bedarfsgesteuert über eine Verbindungszeichenfolge gestartet.
  • Ist für die Programmentwicklung ausgerichtet. Wird im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt.
  • Erstellt standardmäßig MDF-Dateien im Verzeichnis C:/Benutzer/{Benutzer} .

Untersuchen der Datenbank

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

Klicken Sie mit der rechten Maustaste auf die Tabelle Movie (dbo.Movie), und wählen Sie Ansichts-Designer aus.

Klicken mit der rechten Maustaste auf die Tabelle „Movie“ > „Ansichts-Designer“

Im Designer geöffnete Tabelle „Movie“

Beachten Sie das Schlüsselsymbol neben ID. EF macht die Eigenschaft mit dem Namen ID standardmäßig zum Primärschlüssel.

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

Klicken mit der rechten Maustaste auf die Tabelle „Movie“ > „Daten anzeigen“

Geöffnete Tabelle „Movie“ mit Tabellendaten

Ausführen eines Seedings für die Datenbank

Erstellen Sie im Ordner SeedData die neue Klasse SeedData. Ersetzen Sie den generierten Code durch den folgenden:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // 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;  // DB has been seeded.
}

<a name=snippet_"si">

Hinzufügen des Initialisierers des Seedings

Ersetzen Sie den Inhalt von Program.cs durch den folgenden Code. Der neue Code ist hervorgehoben.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

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

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

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

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

Testen der App. Erzwingen Sie die Initialisierung der App, indem Sie den Code in der Datei Program.cs aufrufen, damit die Seed-Methode ausgeführt wird. Um die Initialisierung zu erzwingen, schließen Sie das Eingabeaufforderungsfenster, das Visual Studio geöffnet hat, und starten Sie es über STRG+F5 neu.

Die App zeigt die per Seeding hinzugefügten Daten.

In Microsoft Edge geöffnete MVC Movie-App mit Filmdaten

Das MvcMovieContext-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 Datei Program.cs registriert:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString. Für die lokale Entwicklung wird die Verbindungszeichenfolge aus der Datei appsettings.json abgerufen:

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;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 einfache Version der SQL Server Express-Datenbank-Engine, die standardmäßig mit Visual Studio installiert wird.
  • Wird bedarfsgesteuert über eine Verbindungszeichenfolge gestartet.
  • Ist für die Programmentwicklung ausgerichtet. Wird im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt.
  • Erstellt standardmäßig MDF-Dateien im Verzeichnis C:/Benutzer/{Benutzer} .

Ausführen eines Seedings für die Datenbank

Erstellen Sie im Ordner SeedData die neue Klasse SeedData. Ersetzen Sie den generierten Code durch den folgenden:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // 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;  // DB has been seeded.
}

Hinzufügen des Initialisierers des Seedings

Ersetzen Sie den Inhalt von Program.cs durch den folgenden Code. Der neue Code ist hervorgehoben.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

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

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

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

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

Testen der App. Erzwingen Sie die Initialisierung der App, indem Sie den Code in der Datei Program.cs aufrufen, damit die Seed-Methode ausgeführt wird. Um die Initialisierung zu erzwingen, schließen Sie das Eingabeaufforderungsfenster, das Visual Studio geöffnet hat, und starten Sie es über STRG+F5 neu.

Die App zeigt die per Seeding hinzugefügten Daten.

In Microsoft Edge geöffnete MVC Movie-App mit Filmdaten

Das MvcMovieContext-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 Container Abhängigkeitsinjektion in der ConfigureServices-Methode in der Datei Startup.cs registriert:

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

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

Das ASP.NET Core-Konfigurationssystem liest den Schlüssel ConnectionString. Für die lokale Entwicklung wird die Verbindungszeichenfolge aus der Datei appsettings.json abgerufen:

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;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 einfache Version der SQL Server Express-Datenbank-Engine, die standardmäßig mit Visual Studio installiert wird.
  • Wird bedarfsgesteuert über eine Verbindungszeichenfolge gestartet.
  • Ist für die Programmentwicklung ausgerichtet. Wird im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt.
  • Erstellt standardmäßig MDF-Dateien im Verzeichnis C:/Benutzer/{Benutzer} .

Untersuchen der Datenbank

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

Klicken mit der rechten Maustaste auf die Tabelle „Movie“ > Ansichts-Designer

Im Designer geöffnete Tabelle „Movie“

Beachten Sie das Schlüsselsymbol neben ID. EF macht die Eigenschaft mit dem Namen ID standardmäßig zum Primärschlüssel.

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

Klicken mit der rechten Maustaste auf die Tabelle „Movie“ > Anzeigen von Daten

Geöffnete Tabelle „Movie“ mit Tabellendaten

Ausführen eines Seedings für die Datenbank

Erstellen Sie im Ordner SeedData die neue Klasse SeedData. Ersetzen Sie den generierten Code durch den folgenden:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // 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;  // DB has been seeded.
}

Hinzufügen des Initialisierers des Seedings

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 MvcMovie.Data;
using MvcMovie.Models;
using System;

namespace MvcMovie
{
    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>();
                });
    }
}

Testen Sie die 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. Hierzu können Sie einen der folgenden Ansätze verwenden:

  • 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 Sie Visual Studio im Nicht-Debugmodus ausgeführt haben, drücken Sie F5, um den Debugmodus auszuführen.
    • Wenn Sie Visual Studio im Debugmodus ausgeführt haben, beenden Sie den Debugger, und drücken Sie F5.

Die App zeigt die per Seeding hinzugefügten Daten.

In Microsoft Edge geöffnete MVC Movie-App mit Filmdaten