Współpraca z SQL w ASP.NET CoreWork with SQL in ASP.NET Core

Przez Rick AndersonBy Rick Anderson

Obiekt obsługuje zadanie łączenia się z bazą danych i mapowania Movie obiektów do rekordów bazy danych. MvcMovieContextThe MvcMovieContext object handles the task of connecting to the database and mapping Movie objects to database records. Kontekst bazy danych jest zarejestrowany z kontenerem iniekcji zależności w ConfigureServices metodzie w pliku Startup.cs :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.AddControllersWithViews();
    services.AddRazorPages();

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

System konfiguracji ASP.NET Core odczytuje ConnectionString.The ASP.NET Core Configuration system reads the ConnectionString. W przypadku lokalnego projektowania pobiera parametry połączenia z pliku appSettings. JSON :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"
}

Gdy aplikacja jest wdrażana na serwerze testowym lub produkcyjnym, zmienna środowiskowa może służyć do ustawiania parametrów połączenia do SQL Server produkcyjnej.When the app is deployed to a test or production server, an environment variable can be used to set the connection string to a production SQL Server. Aby uzyskać więcej informacji, zobacz Konfiguracja .See Configuration for more information.

SQL Server Express LocalDBSQL Server Express LocalDB

LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express, która jest przeznaczona do tworzenia programów.LocalDB is a lightweight version of the SQL Server Express Database Engine that's targeted for program development. LocalDB rozpoczyna się na żądanie i działa w trybie użytkownika, więc nie ma żadnych złożonej konfiguracji.LocalDB starts on demand and runs in user mode, so there's no complex configuration. Domyślnie baza danych LocalDB tworzy pliki MDF w katalogu C:/Users/{User} .By default, LocalDB database creates .mdf files in the C:/Users/{user} directory.

  • Z menu Widok Otwórz Eksplorator obiektów SQL Server (SSOX).From the View menu, open SQL Server Object Explorer (SSOX).

    Menu Widok

  • Kliknij prawym przyciskiem Movie myszy tabelę > View DesignerRight click on the Movie table > View Designer

    Menu kontekstowe jest otwarte w tabeli filmów

    Tabela filmów otwarta w projektancie

Zanotuj ikonę klucza obok pozycji ID.Note the key icon next to ID. Domyślnie EF utworzy właściwość o nazwie ID klucz podstawowy.By default, EF will make a property named ID the primary key.

  • Kliknij prawym przyciskiem Movie myszy tabelę, > wyświetlić daneRight click on the Movie table > View Data

    Menu kontekstowe jest otwarte w tabeli filmów

    Otwórz tabelę filmów pokazującą dane tabeli

Inicjowanie bazy danychSeed the database

Utwórz nową klasę o nazwie SeedData w folderze models .Create a new class named SeedData in the Models folder. Zastąp wygenerowany kod następującym: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();
            }
        }
    }
}

Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjatora inicjatora zwraca i nie dodano żadnych filmów.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.
}

Dodawanie inicjatora inicjatoraAdd the seed initializer

Zastąp zawartość program.cs następującym kodem: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>();
    }
}

Testowanie aplikacjiTest the app

  • Usuń wszystkie rekordy z bazy danych.Delete all the records in the DB. Można to zrobić za pomocą linków usuwania w przeglądarce lub z SSOX.You can do this with the delete links in the browser or from SSOX.

  • Wymuś inicjalizację aplikacji (wywołaj metody z Startup klasy), aby była uruchamiana Metoda inicjatora.Force the app to initialize (call the methods in the Startup class) so the seed method runs. Aby wymusić inicjalizację, IIS Express należy zatrzymać i uruchomić ponownie.To force initialization, IIS Express must be stopped and restarted. Można to zrobić przy użyciu następujących metod:You can do this with any of the following approaches:

    • Kliknij prawym przyciskiem myszy ikonę IIS Express pasku zadań w obszarze powiadomień i naciśnij pozycję Zakończ lub Zatrzymaj witrynęRight click the IIS Express system tray icon in the notification area and tap Exit or Stop Site

      Ikona paska zadań IIS Express

      Menu kontekstowe

      • W przypadku uruchamiania programu VS w trybie innym niż debugowanie naciśnij klawisz F5, aby uruchomić w trybie debugowaniaIf you were running VS in non-debug mode, press F5 to run in debug mode
      • W przypadku uruchamiania programu VS w trybie debugowania Zatrzymaj debuger i naciśnij klawisz F5.If you were running VS in debug mode, stop the debugger and press F5

Aplikacja pokazuje dane z rozrzutu.The app shows the seeded data.

Aplikacja filmowa MVC otwarta w przeglądarce Microsoft Edge pokazująca dane filmu

Przez Rick AndersonBy Rick Anderson

Obiekt obsługuje zadanie łączenia się z bazą danych i mapowania Movie obiektów do rekordów bazy danych. MvcMovieContextThe MvcMovieContext object handles the task of connecting to the database and mapping Movie objects to database records. Kontekst bazy danych jest zarejestrowany z kontenerem iniekcji zależności w ConfigureServices metodzie w pliku Startup.cs :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")));
}

System konfiguracji ASP.NET Core odczytuje ConnectionString.The ASP.NET Core Configuration system reads the ConnectionString. W przypadku lokalnego projektowania pobiera parametry połączenia z pliku appSettings. JSON :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"
}

Podczas wdrażania aplikacji na serwerze testowym lub produkcyjnym można użyć zmiennej środowiskowej lub innego podejścia do ustawiania parametrów połączenia dla rzeczywistych SQL Server.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. Aby uzyskać więcej informacji, zobacz Konfiguracja .See Configuration for more information.

SQL Server Express LocalDBSQL Server Express LocalDB

LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express, która jest przeznaczona do tworzenia programów.LocalDB is a lightweight version of the SQL Server Express Database Engine that's targeted for program development. LocalDB rozpoczyna się na żądanie i działa w trybie użytkownika, więc nie ma żadnych złożonej konfiguracji.LocalDB starts on demand and runs in user mode, so there's no complex configuration. Domyślnie baza danych LocalDB tworzy pliki MDF w katalogu C:/Users/{User} .By default, LocalDB database creates .mdf files in the C:/Users/{user} directory.

  • Z menu Widok Otwórz Eksplorator obiektów SQL Server (SSOX).From the View menu, open SQL Server Object Explorer (SSOX).

    Menu Widok

  • Kliknij prawym przyciskiem Movie myszy tabelę > View DesignerRight click on the Movie table > View Designer

    Menu kontekstowe jest otwarte w tabeli filmów

    Tabela filmów otwarta w projektancie

Zanotuj ikonę klucza obok pozycji ID.Note the key icon next to ID. Domyślnie EF utworzy właściwość o nazwie ID klucz podstawowy.By default, EF will make a property named ID the primary key.

  • Kliknij prawym przyciskiem Movie myszy tabelę, > wyświetlić daneRight click on the Movie table > View Data

    Menu kontekstowe jest otwarte w tabeli filmów

    Otwórz tabelę filmów pokazującą dane tabeli

Inicjowanie bazy danychSeed the database

Utwórz nową klasę o nazwie SeedData w folderze models .Create a new class named SeedData in the Models folder. Zastąp wygenerowany kod następującym: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();
            }
        }
    }
}

Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjatora inicjatora zwraca i nie dodano żadnych filmów.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.
}

Dodawanie inicjatora inicjatoraAdd the seed initializer

Zastąp zawartość program.cs następującym kodem: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>();
    }
}

Testowanie aplikacjiTest the app

  • Usuń wszystkie rekordy z bazy danych.Delete all the records in the DB. Można to zrobić za pomocą linków usuwania w przeglądarce lub z SSOX.You can do this with the delete links in the browser or from SSOX.

  • Wymuś inicjalizację aplikacji (wywołaj metody z Startup klasy), aby była uruchamiana Metoda inicjatora.Force the app to initialize (call the methods in the Startup class) so the seed method runs. Aby wymusić inicjalizację, IIS Express należy zatrzymać i uruchomić ponownie.To force initialization, IIS Express must be stopped and restarted. Można to zrobić przy użyciu następujących metod:You can do this with any of the following approaches:

    • Kliknij prawym przyciskiem myszy ikonę IIS Express pasku zadań w obszarze powiadomień i naciśnij pozycję Zakończ lub Zatrzymaj witrynęRight click the IIS Express system tray icon in the notification area and tap Exit or Stop Site

      Ikona paska zadań IIS Express

      Menu kontekstowe

      • W przypadku uruchamiania programu VS w trybie innym niż debugowanie naciśnij klawisz F5, aby uruchomić w trybie debugowaniaIf you were running VS in non-debug mode, press F5 to run in debug mode
      • W przypadku uruchamiania programu VS w trybie debugowania Zatrzymaj debuger i naciśnij klawisz F5.If you were running VS in debug mode, stop the debugger and press F5

Aplikacja pokazuje dane z rozrzutu.The app shows the seeded data.

Aplikacja filmowa MVC otwarta w przeglądarce Microsoft Edge pokazująca dane filmu