Część 5, praca z bazą danych w aplikacji MVC platformy ASP.NET Core

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Ważne

Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Przez Rick Anderson i Jon P Smith.

Obiekt MvcMovieContext obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Program.cs Wstrzykiwanie zależności w pliku:

var builder = WebApplication.CreateBuilder(args);

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

System ASP.NET Core Configuration odczytuje ConnectionString klucz. W przypadku programowania lokalnego pobiera parametry połączenia z appsettings.json pliku:

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

Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym można użyć zmiennej środowiskowej, aby ustawić parametry połączenia na produkcyjny program SQL Server. Aby uzyskać więcej informacji, zobacz Konfiguracja.

SQL Server Express LocalDB

Localdb:

  • To uproszczona wersja aparatu bazy danych SQL Server Express Database, instalowana domyślnie w programie Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu parametry połączenia.
  • Jest przeznaczony do opracowywania programów. Działa w trybie użytkownika, więc nie ma złożonej konfiguracji.
  • Domyślnie tworzy pliki .mdf w katalogu C:/Users/{user} .

Badanie bazy danych

W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).

Kliknij prawym przyciskiem myszy tabelę Movie (dbo.Movie) > Widok Projektant

Kliknij prawym przyciskiem myszy Projektant Widok tabeli > Film.

Tabela filmów otwarta w Projektant

Zanotuj ikonę klucza obok IDpozycji . Domyślnie program EF tworzy właściwość o nazwie ID klucz podstawowy.

Kliknij prawym przyciskiem myszy tabelę Movie> Wyświetl dane

Kliknij prawym przyciskiem myszy dane > widoku filmu.

Otwarta tabela filmów przedstawiająca dane tabeli

Inicjowanie bazy danych

Utwórz nową klasę o nazwie SeedData w folderze Models . Zastąp wygenerowany kod następującym kodem:

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

Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.

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

Dodawanie inicjatora inicjatora

Zastąp zawartość Program.cs pliku następującym kodem. Nowy kod został wyróżniony.

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();

Usuń wszystkie rekordy w bazie danych. Można to zrobić za pomocą linków usuwania w przeglądarce lub z poziomu systemu SSOX.

Testowanie aplikacji. Wymuś zainicjowanie aplikacji, wywołując kod w pliku, więc metoda inicjowania Program.cs jest uruchamiana. Aby wymusić inicjowanie, zamknij okno wiersza polecenia otwarte przez program Visual Studio i uruchom ponownie, naciskając klawisze Ctrl+F5.

Aplikacja wyświetla dane rozstawione.

Aplikacja MVC Movie otwarta w przeglądarce Microsoft Edge przedstawiająca dane filmu

Obiekt MvcMovieContext obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Program.cs Wstrzykiwanie zależności w pliku:

var builder = WebApplication.CreateBuilder(args);

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

System ASP.NET Core Configuration odczytuje ConnectionString klucz. W przypadku programowania lokalnego pobiera parametry połączenia z appsettings.json pliku:

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

Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym można użyć zmiennej środowiskowej, aby ustawić parametry połączenia na produkcyjny program SQL Server. Aby uzyskać więcej informacji, zobacz Konfiguracja.

SQL Server Express LocalDB

Localdb:

  • To uproszczona wersja aparatu bazy danych SQL Server Express Database, instalowana domyślnie w programie Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu parametry połączenia.
  • Jest przeznaczony do opracowywania programów. Działa w trybie użytkownika, więc nie ma złożonej konfiguracji.
  • Domyślnie tworzy pliki .mdf w katalogu C:/Users/{user} .

Badanie bazy danych

W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).

Kliknij prawym przyciskiem myszy tabelę Movie (dbo.Movie) > Widok Projektant

Kliknij prawym przyciskiem myszy Projektant Widok tabeli > Film.

Tabela filmów otwarta w Projektant

Zanotuj ikonę klucza obok IDpozycji . Domyślnie program EF tworzy właściwość o nazwie ID klucz podstawowy.

Kliknij prawym przyciskiem myszy tabelę Movie> Wyświetl dane

Kliknij prawym przyciskiem myszy dane > widoku filmu.

Otwarta tabela filmów przedstawiająca dane tabeli

Inicjowanie bazy danych

Utwórz nową klasę o nazwie SeedData w folderze Models . Zastąp wygenerowany kod następującym kodem:

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

Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.

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

<a name=snippet_"si">

Dodawanie inicjatora inicjatora

Zastąp zawartość Program.cs pliku następującym kodem. Nowy kod został wyróżniony.

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();

Usuń wszystkie rekordy w bazie danych. Można to zrobić za pomocą linków usuwania w przeglądarce lub z poziomu systemu SSOX.

Testowanie aplikacji. Wymuś zainicjowanie aplikacji, wywołując kod w pliku, więc metoda inicjowania Program.cs jest uruchamiana. Aby wymusić inicjowanie, zamknij okno wiersza polecenia otwarte przez program Visual Studio i uruchom ponownie, naciskając klawisze Ctrl+F5.

Aplikacja wyświetla dane rozstawione.

Aplikacja MVC Movie otwarta w przeglądarce Microsoft Edge przedstawiająca dane filmu

Obiekt MvcMovieContext obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Program.cs Wstrzykiwanie zależności w pliku:

var builder = WebApplication.CreateBuilder(args);

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

System ASP.NET Core Configuration odczytuje ConnectionString klucz. W przypadku programowania lokalnego pobiera parametry połączenia z appsettings.json pliku:

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

Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym można użyć zmiennej środowiskowej, aby ustawić parametry połączenia na produkcyjny program SQL Server. Aby uzyskać więcej informacji, zobacz Konfiguracja.

SQL Server Express LocalDB

Localdb:

  • To uproszczona wersja aparatu bazy danych SQL Server Express Database, instalowana domyślnie w programie Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu parametry połączenia.
  • Jest przeznaczony do opracowywania programów. Działa w trybie użytkownika, więc nie ma złożonej konfiguracji.
  • Domyślnie tworzy pliki .mdf w katalogu C:/Users/{user} .

Inicjowanie bazy danych

Utwórz nową klasę o nazwie SeedData w folderze Models . Zastąp wygenerowany kod następującym kodem:

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

Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.

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

Dodawanie inicjatora inicjatora

Zastąp zawartość Program.cs pliku następującym kodem. Nowy kod został wyróżniony.

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();

Usuń wszystkie rekordy w bazie danych. Można to zrobić za pomocą linków usuwania w przeglądarce lub z poziomu systemu SSOX.

Testowanie aplikacji. Wymuś zainicjowanie aplikacji, wywołując kod w pliku, więc metoda inicjowania Program.cs jest uruchamiana. Aby wymusić inicjowanie, zamknij okno wiersza polecenia otwarte przez program Visual Studio i uruchom ponownie, naciskając klawisze Ctrl+F5.

Aplikacja wyświetla dane rozstawione.

Aplikacja MVC Movie otwarta w przeglądarce Microsoft Edge przedstawiająca dane filmu

Obiekt MvcMovieContext obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze wstrzykiwania zależności w ConfigureServices metodzie Startup.cs w pliku :

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

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

System ASP.NET Core Configuration odczytuje ConnectionString klucz. W przypadku programowania lokalnego pobiera parametry połączenia z appsettings.json pliku:

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

Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym można użyć zmiennej środowiskowej, aby ustawić parametry połączenia na produkcyjny program SQL Server. Aby uzyskać więcej informacji, zobacz Konfiguracja.

SQL Server Express LocalDB

Localdb:

  • To uproszczona wersja aparatu bazy danych SQL Server Express Database, instalowana domyślnie w programie Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu parametry połączenia.
  • Jest przeznaczony do opracowywania programów. Działa w trybie użytkownika, więc nie ma złożonej konfiguracji.
  • Domyślnie tworzy pliki .mdf w katalogu C:/Users/{user} .

Badanie bazy danych

W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).

Menu Widok

Kliknij prawym przyciskiem myszy tabelę Movie> Widok Projektant

Kliknij prawym przyciskiem myszy widok tabeli > Movie Projektant

Tabela filmów otwarta w Projektant

Zanotuj ikonę klucza obok IDpozycji . Domyślnie program EF tworzy właściwość o nazwie ID klucz podstawowy.

Kliknij prawym przyciskiem myszy tabelę Movie> Wyświetl dane

Kliknij prawym przyciskiem myszy dane widoku filmu >

Otwarta tabela filmów przedstawiająca dane tabeli

Inicjowanie bazy danych

Utwórz nową klasę o nazwie SeedData w folderze Models . Zastąp wygenerowany kod następującym kodem:

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

Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.

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

Dodawanie inicjatora inicjatora

Zastąp zawartość Program.cs następującym kodem:

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

Testowanie aplikacji.

Usuń wszystkie rekordy w bazie danych. Można to zrobić za pomocą linków usuwania w przeglądarce lub z poziomu systemu SSOX.

Wymuś zainicjowanie aplikacji, wywołując metody w Startup klasie, więc metoda seed jest uruchamiana. Aby wymusić inicjowanie, należy zatrzymać i ponownie uruchomić usługę IIS Express. Można to zrobić przy użyciu dowolnego z następujących podejść:

  • Kliknij prawym przyciskiem myszy ikonę paska zadań systemu IIS Express w obszarze powiadomień, a następnie naciśnij pozycję Zakończ lub Zatrzymaj lokację:

    Ikona paska zadań usług IIS Express

    Menu kontekstowe

    • Jeśli program VS był uruchomiony w trybie nie debugowania, naciśnij klawisz F5, aby uruchomić w trybie debugowania
    • Jeśli program VS był uruchomiony w trybie debugowania, zatrzymaj debuger i naciśnij klawisz F5

Aplikacja wyświetla dane rozstawione.

Aplikacja MVC Movie otwarta w przeglądarce Microsoft Edge przedstawiająca dane filmu