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

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz artykuł w wersji .NET 10.

Ostrzeżenie

Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy. Aby zapoznać się z bieżącą wersją, zobacz artykuł w wersji .NET 10.

Wprowadzenie

Ta część serii samouczków koncentruje się na pracy z bazą danych SQL w aplikacji ASP.NET Core MVC.

Dowiesz się, jak:

  • Zarejestruj i skonfiguruj kontekst bazy danych Entity Framework Core dla aplikacji MVC ASP.NET Core.
  • Praca z parametrami połączenia bazy danych na potrzeby programowania lokalnego.
  • Użyj SQL Server Express LocalDB do programowania i analizowania bazy danych i danych przy użyciu SQL Server Eksplorator obiektów.
  • Wypełnij bazę danych danymi przykładowymi.

Warunek wstępny

W tym samouczku użyto bazy danych skonfigurowanej w poprzednim kroku: Part 4, dodać model do aplikacji MVC ASP.NET Core.

Praca z kontekstem bazy danych

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

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

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

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Ostrzeżenie

W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.

SQL Server Express LocalDB (lokalna baza danych)

LocalDB:

  • Jest to uproszczona wersja SQL Server Express Database Engine instalowana domyślnie z Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu ciągu 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 View otwórz SQL Server Eksplorator obiektów (SSOX).

Kliknij prawym przyciskiem myszy tabelę Movie (dbo.Movie) > Projektant widoków

Kliknij prawym przyciskiem myszy tabelę > Movie, a następnie wybierz Projektanta Widoku.

Tabela filmów otwarta w Designerze.

Zwróć uwagę na ikonę klucza obok ID. 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 tabelę Movie > i wybierz opcję Pokaż Dane.

Tabela filmów otwarta bez danych.

Zasianie 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 zwraca kontrolę i nie dodaje żadnych filmów.

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

Dodaj inicjator seeda

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") ?? 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?}")
    .WithStaticAssets();

app.Run();

Testowanie aplikacji. Wymuś zainicjowanie aplikacji, wywołując kod w pliku Program.cs, aby uruchomić metodę seed. Aby wymusić inicjalizację, zamknij okno wiersza poleceń, które Visual Studio otworzyło, a następnie uruchom ponownie, naciskając klawisze Ctrl+F5.

Aplikacja wyświetla dane rozstawione.

Aplikacja MVC Movie otwarta w Microsoft Edge pokazująca dane filmów.

Odświeżenie tabeli Movie pokazuje te same dane.

Tabela filmów zawiera dane wstępne.

Uwaga

Może nie być możliwe wprowadzenie przecinków dziesiętnych w polach dziesiętnych. Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż anglojęzyczne, które używają przecinka (",") jako separatora dziesiętnego, oraz dla formatów dat spoza USA, należy przeprowadzić globalizację aplikacji. Zobacz ten komentarz GitHub 4076 aby uzyskać instrukcje, jak dodać przecinek dziesiętny.

Wprowadzenie

Ta część serii samouczków koncentruje się na pracy z bazą danych SQL w aplikacji ASP.NET Core MVC.

Dowiesz się, jak:

  • Zarejestruj i skonfiguruj kontekst bazy danych Entity Framework Core dla aplikacji MVC ASP.NET Core.
  • Praca z parametrami połączenia bazy danych na potrzeby programowania lokalnego.
  • Użyj SQL Server Express LocalDB do programowania i analizowania bazy danych i danych przy użyciu SQL Server Eksplorator obiektów.
  • Wypełnij bazę danych danymi przykładowymi.

Warunek wstępny

W tym samouczku użyto bazy danych skonfigurowanej w poprzednim kroku: Part 4, dodać model do aplikacji MVC ASP.NET Core.

Praca z kontekstem bazy danych

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

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

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

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Ostrzeżenie

W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.

SQL Server Express LocalDB (lokalna baza danych)

LocalDB:

  • Jest to uproszczona wersja SQL Server Express Database Engine instalowana domyślnie z Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu ciągu 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 View otwórz SQL Server Eksplorator obiektów (SSOX).

Kliknij prawym przyciskiem myszy tabelę Movie (dbo.Movie) > Projektant widoków

>

Otwórz tabelę filmów w Designerze

Zwróć uwagę na ikonę klucza obok ID. 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 tabelę Movie > Pokaż dane.

Otwarta tabela filmów przedstawiająca dane tabeli

Zasianie 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 zwraca kontrolę i nie dodaje żadnych filmów.

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

Dodaj inicjator seeda

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

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 Program.cs, aby uruchomić metodę seed. Aby wymusić inicjalizację, zamknij okno wiersza poleceń, które Visual Studio otworzyło, a następnie uruchom ponownie, naciskając klawisze Ctrl+F5.

Aplikacja wyświetla dane rozstawione.

Apka MVC Movie otwarta w Microsoft Edge pokazuje dane filmów

Uwaga

Może nie być możliwe wprowadzenie przecinków dziesiętnych w polach dziesiętnych. Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż anglojęzyczne, które używają przecinka (",") jako separatora dziesiętnego, oraz dla formatów dat spoza USA, należy przeprowadzić globalizację aplikacji. Zobacz ten komentarz GitHub 4076 aby uzyskać instrukcje, jak dodać przecinek dziesiętny.

Wprowadzenie

Ta część serii samouczków koncentruje się na pracy z bazą danych SQL w aplikacji ASP.NET Core MVC.

Dowiesz się, jak:

  • Zarejestruj i skonfiguruj kontekst bazy danych Entity Framework Core dla aplikacji MVC ASP.NET Core.
  • Praca z parametrami połączenia bazy danych na potrzeby programowania lokalnego.
  • Użyj SQL Server Express LocalDB do programowania i analizowania bazy danych i danych przy użyciu SQL Server Eksplorator obiektów.
  • Wypełnij bazę danych danymi przykładowymi.

Warunek wstępny

W tym samouczku użyto bazy danych skonfigurowanej w poprzednim kroku: Part 4, dodać model do aplikacji MVC ASP.NET Core.

Praca z kontekstem bazy danych

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

var builder = WebApplication.CreateBuilder(args);

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

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

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

Ostrzeżenie

W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.

SQL Server Express LocalDB (lokalna baza danych)

LocalDB:

  • Jest to uproszczona wersja SQL Server Express Database Engine instalowana domyślnie z Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu ciągu 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 View otwórz SQL Server Eksplorator obiektów (SSOX).

Kliknij prawym przyciskiem myszy tabelę Movie (dbo.Movie) > Projektant widoków

>

Otwórz tabelę filmów w Designerze

Zwróć uwagę na ikonę klucza obok ID. 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 tabelę Movie > Pokaż dane.

Otwarta tabela filmów przedstawiająca dane tabeli

Zasianie 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 zwraca kontrolę i nie dodaje żadnych filmów.

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

Dodaj inicjator seeda

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 Program.cs, aby uruchomić metodę seed. Aby wymusić inicjalizację, zamknij okno wiersza poleceń, które Visual Studio otworzyło, a następnie uruchom ponownie, naciskając klawisze Ctrl+F5.

Aplikacja wyświetla dane rozstawione.

Apka MVC Movie otwarta w Microsoft Edge pokazuje dane filmów

Uwaga

Może nie być możliwe wprowadzenie przecinków dziesiętnych w polach dziesiętnych. Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż anglojęzyczne, które używają przecinka (",") jako separatora dziesiętnego, oraz dla formatów dat spoza USA, należy przeprowadzić globalizację aplikacji. Zobacz ten komentarz GitHub 4076 aby uzyskać instrukcje, jak dodać przecinek dziesiętny.

Wprowadzenie

Ta część serii samouczków koncentruje się na pracy z bazą danych SQL w aplikacji ASP.NET Core MVC.

Dowiesz się, jak:

  • Zarejestruj i skonfiguruj kontekst bazy danych Entity Framework Core dla aplikacji MVC ASP.NET Core.
  • Praca z parametrami połączenia bazy danych na potrzeby programowania lokalnego.
  • Użyj SQL Server Express LocalDB do programowania i analizowania bazy danych i danych przy użyciu SQL Server Eksplorator obiektów.
  • Wypełnij bazę danych danymi przykładowymi.

Warunek wstępny

W tym samouczku użyto bazy danych skonfigurowanej w poprzednim kroku: Part 4, dodać model do aplikacji MVC ASP.NET Core.

Praca z kontekstem bazy danych

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

var builder = WebApplication.CreateBuilder(args);

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

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

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

Ostrzeżenie

W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.

SQL Server Express LocalDB (lokalna baza danych)

LocalDB:

  • Jest to uproszczona wersja SQL Server Express Database Engine instalowana domyślnie z Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu ciągu 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 View otwórz SQL Server Eksplorator obiektów (SSOX).

Kliknij prawym przyciskiem myszy tabelę Movie (dbo.Movie) > Projektant widoków

>

Otwórz tabelę filmów w Designerze

Zwróć uwagę na ikonę klucza obok ID. 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 tabelę Movie > Pokaż dane.

Otwarta tabela filmów przedstawiająca dane tabeli

Zasianie 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 zwraca kontrolę i nie dodaje żadnych filmów.

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

<a name=snippet_"si">

Dodaj inicjator seeda

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 Program.cs, aby uruchomić metodę seed. Aby wymusić inicjalizację, zamknij okno wiersza poleceń, które Visual Studio otworzyło, a następnie uruchom ponownie, naciskając klawisze Ctrl+F5.

Aplikacja wyświetla dane rozstawione.

Apka MVC Movie otwarta w Microsoft Edge pokazuje dane filmów

Uwaga

Może nie być możliwe wprowadzenie przecinków dziesiętnych w polach dziesiętnych. Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż anglojęzyczne, które używają przecinka (",") jako separatora dziesiętnego, oraz dla formatów dat spoza USA, należy przeprowadzić globalizację aplikacji. Zobacz ten komentarz GitHub 4076 aby uzyskać instrukcje, jak dodać przecinek dziesiętny.

Wprowadzenie

Ta część serii samouczków koncentruje się na pracy z bazą danych SQL w aplikacji ASP.NET Core MVC.

Dowiesz się, jak:

  • Zarejestruj i skonfiguruj kontekst bazy danych Entity Framework Core dla aplikacji MVC ASP.NET Core.
  • Praca z parametrami połączenia bazy danych na potrzeby programowania lokalnego.
  • Użyj SQL Server Express LocalDB do programowania i analizowania bazy danych i danych przy użyciu SQL Server Eksplorator obiektów.
  • Wypełnij bazę danych danymi przykładowymi.

Warunek wstępny

W tym samouczku użyto bazy danych skonfigurowanej w poprzednim kroku: Part 4, dodać model do aplikacji MVC ASP.NET Core.

Praca z kontekstem bazy danych

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

var builder = WebApplication.CreateBuilder(args);

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

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

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

Ostrzeżenie

W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.

SQL Server Express LocalDB (lokalna baza danych)

LocalDB:

  • Jest to uproszczona wersja SQL Server Express Database Engine instalowana domyślnie z Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu ciągu 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} .

Zasianie 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 zwraca kontrolę i nie dodaje żadnych filmów.

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

Dodaj inicjator seeda

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 Program.cs, aby uruchomić metodę seed. Aby wymusić inicjalizację, zamknij okno wiersza poleceń, które Visual Studio otworzyło, a następnie uruchom ponownie, naciskając klawisze Ctrl+F5.

Aplikacja wyświetla dane rozstawione.

Apka MVC Movie otwarta w Microsoft Edge pokazuje dane filmów

Uwaga

Może nie być możliwe wprowadzenie przecinków dziesiętnych w polach dziesiętnych. Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż anglojęzyczne, które używają przecinka (",") jako separatora dziesiętnego, oraz dla formatów dat spoza USA, należy przeprowadzić globalizację aplikacji. Zobacz ten komentarz GitHub 4076 aby uzyskać instrukcje, jak dodać przecinek dziesiętny.

Wprowadzenie

Ta część serii samouczków koncentruje się na pracy z bazą danych SQL w aplikacji ASP.NET Core MVC.

Dowiesz się, jak:

  • Zarejestruj i skonfiguruj kontekst bazy danych Entity Framework Core dla aplikacji MVC ASP.NET Core.
  • Praca z parametrami połączenia bazy danych na potrzeby programowania lokalnego.
  • Użyj SQL Server Express LocalDB do programowania i analizowania bazy danych i danych przy użyciu SQL Server Eksplorator obiektów.
  • Wypełnij bazę danych danymi przykładowymi.

Warunek wstępny

W tym samouczku użyto bazy danych skonfigurowanej w poprzednim kroku: Part 4, dodać model do aplikacji MVC ASP.NET Core.

Praca z kontekstem bazy danych

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 w pliku Startup.cs.

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

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

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

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

Ostrzeżenie

W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.

SQL Server Express LocalDB (lokalna baza danych)

LocalDB:

  • Jest to uproszczona wersja SQL Server Express Database Engine instalowana domyślnie z Visual Studio.
  • Rozpoczyna się na żądanie przy użyciu ciągu 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 View otwórz SQL Server Eksplorator obiektów (SSOX).

Menu Widok

Kliknij prawym przyciskiem myszy Movie tabelę w > Projektancie Widoków

Kliknij prawym przyciskiem myszy tabelę > Movie i wybierz Projektant widoku

Otwórz tabelę filmów w Designerze

Zwróć uwagę na ikonę klucza obok ID. 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 tabelę Film > Wyświetl dane

Otwarta tabela filmów przedstawiająca dane tabeli

Zasianie 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 zwraca kontrolę i nie dodaje żadnych filmów.

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

Dodaj inicjator seeda

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 klasie Startup, aby uruchomić metodę seed. 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ę systemową IIS Express w obszarze powiadomień i wybierz Zakończ lub Zatrzymaj witrynę:

    Ikona zasobnika systemowego IIS Express

    Menu kontekstowe

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

Aplikacja wyświetla dane rozstawione.

Apka MVC Movie otwarta w Microsoft Edge pokazuje dane filmów

Uwaga

Może nie być możliwe wprowadzenie przecinków dziesiętnych w polach dziesiętnych. Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż anglojęzyczne, które używają przecinka (",") jako separatora dziesiętnego, oraz dla formatów dat spoza USA, należy przeprowadzić globalizację aplikacji. Zobacz ten komentarz GitHub 4076 aby uzyskać instrukcje, jak dodać przecinek dziesiętny.