Udostępnij za pośrednictwem


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.

Ostrzeżenie

Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy (Zasady obsługi platformy .NET Core). 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") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

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-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Uwaga

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

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) > Projektant widoków

Kliknij prawym przyciskiem myszy projektanta widoku tabeli > Movie.

Tabela filmów otwarta w projektancie

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") ?? 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, 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 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"
}

Uwaga

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

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) > Projektant widoków

Kliknij prawym przyciskiem myszy projektanta widoku tabeli > Movie.

Tabela filmów otwarta w projektancie

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 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"
}

Uwaga

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

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) > Projektant widoków

Kliknij prawym przyciskiem myszy projektanta widoku tabeli > Movie.

Tabela filmów otwarta w projektancie

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 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"
}

Uwaga

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

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 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"
}

Uwaga

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

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 projektanta widoków Movie tabeli >

Kliknij prawym przyciskiem myszy projektanta widoku tabeli > Movie

Tabela filmów otwarta w projektancie

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

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