Arbeiten mit SQL in ASP.NET CoreWork with SQL in ASP.NET Core

Von Rick AndersonBy Rick Anderson

Das MvcMovieContext-Objekt übernimmt die Aufgabe der Herstellung der Verbindung mit der Datenbank und Zuordnung von Movie-Objekten zu Datensätzen in der Datenbank.The MvcMovieContext object handles the task of connecting to the database and mapping Movie objects to database records. Der Datenbankkontext wird mit dem Container Abhängigkeitsinjektion in der Methode ConfigureServices in der Datei Startup.cs registriert:The database context is registered with the Dependency Injection container in the ConfigureServices method in the Startup.cs file:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies 
        // is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

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

Das ASP.NET Core-Konfigurationssystem liest die ConnectionString.The ASP.NET Core Configuration system reads the ConnectionString. Für die lokale Entwicklung wird die Verbindungszeichenfolge aus der Datei appsettings.json abgerufen:For local development, it gets the connection string from the appsettings.json file:

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Wenn Sie die App auf einem Test- oder Produktionsserver bereitstellen, können Sie eine Umgebungsvariable oder eine andere Vorgehensweise zum Festlegen der Verbindungszeichenfolge für einen tatsächlichen SQL Server-Computer verwenden.When you deploy the app to a test or production server, you can use an environment variable or another approach to set the connection string to a real SQL Server. Weitere Informationen finden Sie unter Konfiguration.See Configuration for more information.

SQL Server Express LocalDBSQL Server Express LocalDB

LocalDB ist eine Lightweightversion der SQL Server Express-Datenbank-Engine, die für die Programmentwicklung geeignet ist.LocalDB is a lightweight version of the SQL Server Express Database Engine that's targeted for program development. LocalDB wird bedarfsgesteuert gestartet und im Benutzermodus ausgeführt, sodass keine komplexe Konfiguration anfällt.LocalDB starts on demand and runs in user mode, so there's no complex configuration. Die LocalDB-Datenbank erstellt standardmäßig MDF-Dateien im Verzeichnis C:/Benutzer/{Benutzer}.By default, LocalDB database creates .mdf files in the C:/Users/{user} directory.

  • Öffnen Sie im Menü Ansicht den SQL Server-Objekt-Explorer (SSOX).From the View menu, open SQL Server Object Explorer (SSOX).

    Menü Ansicht

  • Klicken Sie mit der rechten Maustaste auf die Tabelle Movie > Ansicht-Designer.Right click on the Movie table > View Designer

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

    Im Designer geöffnete Tabelle „Movie“

Beachten Sie das Schlüsselsymbol neben ID.Note the key icon next to ID. EF macht die Eigenschaft ID standardmäßig zum Primärschlüssel.By default, EF will make a property named ID the primary key.

  • Klicken Sie mit der rechten Maustaste auf die Tabelle Movie > Daten anzeigen.Right click on the Movie table > View Data

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

    Geöffnete Tabelle „Movie“ mit Tabellendaten

Ausführen eines Seedings für die DatenbankSeed the database

Erstellen Sie im Ordner Models die neue Klasse SeedData.Create a new class named SeedData in the Models folder. Ersetzen Sie den generierten Code durch den folgenden:Replace the generated code with the following:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
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 there are any movies in the DB, the seed initializer returns and no movies are added.

if (context.Movie.Any())
{
    return;   // DB has been seeded.
}

Hinzufügen des Initialisierers des SeedingsAdd the seed initializer

Ersetzen Sie den Inhalt von Program.cs durch den folgenden Code:Replace the contents of Program.cs with the following code:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
using MvcMovie;

namespace MvcMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();

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

                try
                {
                    var context = services.GetRequiredService<MvcMovieContext>();
                    context.Database.Migrate();
                    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 IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

Testen der AppTest the app

  • Löschen Sie alle Datensätze in der Datenbank.Delete all the records in the DB. Dies ist über die Links „Löschen“ im Browser oder SSOX möglich.You can do this with the delete links in the browser or from SSOX.

  • Zwingen Sie die App zur Initialisierung (rufen Sie die Methoden in der Startup-Klasse auf), damit die Seed-Methode ausgeführt wird.Force the app to initialize (call the methods in the Startup class) so the seed method runs. Um die Initialisierung zu erzwingen, muss IIS Express beendet und neu gestartet werden.To force initialization, IIS Express must be stopped and restarted. Hierzu können Sie einen der folgenden Ansätze verwenden:You can do this with any of the following approaches:

    • 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.Right click the IIS Express system tray icon in the notification area and tap Exit or Stop Site

      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.If you were running VS in non-debug mode, press F5 to run in debug mode
      • Wenn Sie Visual Studio im Debugmodus ausgeführt haben, beenden Sie den Debugger, und drücken Sie F5.If you were running VS in debug mode, stop the debugger and press F5

Die App zeigt die per Seeding hinzugefügten Daten.The app shows the seeded data.

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