Часть 5. Работа с базой данных в приложении MVC ASP.NET Core

Примечание.

Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.

Внимание

Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

В текущем выпуске см . версию .NET 8 этой статьи.

Авторы: Рик Андерсон (Rick Anderson) и Джон П. Смит (Jon P Smith)

Объект MvcMovieContext обрабатывает задачу подключения к базе данных и сопоставления объектов Movie с записями базы данных. Контекст базы данных регистрируется с помощью контейнера внедрения зависимостей в файле Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

Система конфигурации ASP.NET Core считывает ключ ConnectionString. Для разработки на локальном уровне она получает строку подключения из файла appsettings.json.

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

Если приложение развертывается на тестовом или рабочем сервере, можно задать строку подключения к рабочему SQL Server с помощью переменной среды. Дополнительные сведения см. в статье Конфигурация.

SQL Server Express LocalDB

LocalDB

  • — это упрощенная версия ядра СУБД SQL Server Express, устанавливаемая по умолчанию с Visual Studio.
  • Запускается по требованию с помощью строки подключения.
  • Используется для разработки программ. Запускается в пользовательском режиме, поэтому конфигурация не слишком сложная.
  • По умолчанию создает файлы .mdf в каталоге C:/Users/{user}.

Проверка базы данных

В меню Вид откройте обозреватель объектов SQL Server (SSOX).

Щелкните правой кнопкой мыши конструктор представлений Movie таблицы (dbo.Movie) >

Щелкните правой кнопкой мыши конструктор представлений таблицы >

Таблица Movie, открытая в конструкторе

Обратите внимание на значок с изображением ключа рядом с ID. По умолчанию EF сделает свойство с именем ID первичным ключом.

Щелкните правой кнопкой мыши таблицу Movie>Просмотр данных.

Щелкните правой кнопкой мыши данные представления таблицы >

Открытая таблица Movie с отображением данных

Заполнение базы данных

Создайте класс SeedData в папке Models. Замените сгенерированный код следующим кодом:

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

Если в базе данных есть фильмы, возвращается инициализатор заполнения и фильмы не добавляются.

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

Добавление инициализатора заполнения

Замените все содержимое Program.cs следующим кодом: Новый код выделен.

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

Удалите все записи в базе данных. Это можно сделать с помощью ссылок удаления в браузере или из SSOX.

Тестирование приложения. Принудительно инициализировать приложение, вызывая код в Program.cs файле, поэтому начальный метод запускается. Чтобы выполнить инициализацию принудительно, закройте окно командной строки, открытое Visual Studio, и перезапустите, нажав клавиши CTRL+F5.

В приложении будут отображены данные.

Приложение MVC Movie, открытое в Microsoft Edge и отображающие данные о фильме

Объект MvcMovieContext обрабатывает задачу подключения к базе данных и сопоставления объектов Movie с записями базы данных. Контекст базы данных регистрируется с помощью контейнера внедрения зависимостей в файле Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

Система конфигурации ASP.NET Core считывает ключ ConnectionString. Для разработки на локальном уровне она получает строку подключения из файла appsettings.json.

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

Если приложение развертывается на тестовом или рабочем сервере, можно задать строку подключения к рабочему SQL Server с помощью переменной среды. Дополнительные сведения см. в статье Конфигурация.

SQL Server Express LocalDB

LocalDB

  • — это упрощенная версия ядра СУБД SQL Server Express, устанавливаемая по умолчанию с Visual Studio.
  • Запускается по требованию с помощью строки подключения.
  • Используется для разработки программ. Запускается в пользовательском режиме, поэтому конфигурация не слишком сложная.
  • По умолчанию создает файлы .mdf в каталоге C:/Users/{user}.

Проверка базы данных

В меню Вид откройте обозреватель объектов SQL Server (SSOX).

Щелкните правой кнопкой мыши конструктор представлений Movie таблицы (dbo.Movie) >

Щелкните правой кнопкой мыши конструктор представлений таблицы >

Таблица Movie, открытая в конструкторе

Обратите внимание на значок с изображением ключа рядом с ID. По умолчанию EF сделает свойство с именем ID первичным ключом.

Щелкните правой кнопкой мыши таблицу Movie>Просмотр данных.

Щелкните правой кнопкой мыши данные представления таблицы >

Открытая таблица Movie с отображением данных

Заполнение базы данных

Создайте класс SeedData в папке Models. Замените сгенерированный код следующим кодом:

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

Если в базе данных есть фильмы, возвращается инициализатор заполнения и фильмы не добавляются.

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

<a name=snippet_"si">

Добавление инициализатора заполнения

Замените все содержимое Program.cs следующим кодом: Новый код выделен.

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

Удалите все записи в базе данных. Это можно сделать с помощью ссылок удаления в браузере или из SSOX.

Тестирование приложения. Принудительно инициализировать приложение, вызывая код в Program.cs файле, поэтому начальный метод запускается. Чтобы выполнить инициализацию принудительно, закройте окно командной строки, открытое Visual Studio, и перезапустите, нажав клавиши CTRL+F5.

В приложении будут отображены данные.

Приложение MVC Movie, открытое в Microsoft Edge и отображающие данные о фильме

Объект MvcMovieContext обрабатывает задачу подключения к базе данных и сопоставления объектов Movie с записями базы данных. Контекст базы данных регистрируется с помощью контейнера внедрения зависимостей в файле Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

Система конфигурации ASP.NET Core считывает ключ ConnectionString. Для разработки на локальном уровне она получает строку подключения из файла appsettings.json.

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

Если приложение развертывается на тестовом или рабочем сервере, можно задать строку подключения к рабочему SQL Server с помощью переменной среды. Дополнительные сведения см. в статье Конфигурация.

SQL Server Express LocalDB

LocalDB

  • — это упрощенная версия ядра СУБД SQL Server Express, устанавливаемая по умолчанию с Visual Studio.
  • Запускается по требованию с помощью строки подключения.
  • Используется для разработки программ. Запускается в пользовательском режиме, поэтому конфигурация не слишком сложная.
  • По умолчанию создает файлы .mdf в каталоге C:/Users/{user}.

Заполнение базы данных

Создайте класс SeedData в папке Models. Замените сгенерированный код следующим кодом:

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

Если в базе данных есть фильмы, возвращается инициализатор заполнения и фильмы не добавляются.

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

Добавление инициализатора заполнения

Замените все содержимое Program.cs следующим кодом: Новый код выделен.

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

Удалите все записи в базе данных. Это можно сделать с помощью ссылок удаления в браузере или из SSOX.

Тестирование приложения. Принудительно инициализировать приложение, вызывая код в Program.cs файле, поэтому начальный метод запускается. Чтобы выполнить инициализацию принудительно, закройте окно командной строки, открытое Visual Studio, и перезапустите, нажав клавиши CTRL+F5.

В приложении будут отображены данные.

Приложение MVC Movie, открытое в Microsoft Edge и отображающие данные о фильме

Объект MvcMovieContext обрабатывает задачу подключения к базе данных и сопоставления объектов Movie с записями базы данных. Контекст базы данных регистрируется с помощью контейнера внедрения зависимостей в методе ConfigureServices в файле Startup.cs:

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

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

Система конфигурации ASP.NET Core считывает ключ ConnectionString. Для разработки на локальном уровне она получает строку подключения из файла appsettings.json.

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

Если приложение развертывается на тестовом или рабочем сервере, можно задать строку подключения к рабочему SQL Server с помощью переменной среды. Дополнительные сведения см. в статье Конфигурация.

SQL Server Express LocalDB

LocalDB

  • — это упрощенная версия ядра СУБД SQL Server Express, устанавливаемая по умолчанию с Visual Studio.
  • Запускается по требованию с помощью строки подключения.
  • Используется для разработки программ. Запускается в пользовательском режиме, поэтому конфигурация не слишком сложная.
  • По умолчанию создает файлы .mdf в каталоге C:/Users/{user}.

Проверка базы данных

В меню Вид откройте обозреватель объектов SQL Server (SSOX).

Меню

Щелкните правой кнопкой мыши таблицу Movie>Конструктор представлений.

Щелкните правой кнопкой мыши конструктор представлений таблицы >

Таблица Movie, открытая в конструкторе

Обратите внимание на значок с изображением ключа рядом с ID. По умолчанию EF сделает свойство с именем ID первичным ключом.

Щелкните правой кнопкой мыши таблицу Movie>Просмотр данных.

Щелкните правой кнопкой мыши данные представления таблицы >

Открытая таблица Movie с отображением данных

Заполнение базы данных

Создайте класс SeedData в папке Models. Замените сгенерированный код следующим кодом:

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

Если в базе данных есть фильмы, возвращается инициализатор заполнения и фильмы не добавляются.

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

Добавление инициализатора заполнения

Замените все содержимое Program.cs следующим кодом:

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

Тестирование приложения.

Удалите все записи в базе данных. Это можно сделать с помощью ссылок удаления в браузере или из SSOX.

Приложение должно выполнить инициализацию, вызывая методы в классе Startup, чтобы запустить метод заполнения. Для этого следует остановить и перезапустить IIS Express. Воспользуйтесь одним из перечисленных ниже подходов.

  • Щелкните правой кнопкой мыши значок IIS Express в области уведомлений и выберите Выйти или Остановить сайт.

    Значок IIS Express в области уведомлений

    Контекстное меню

    • Если среда VS была запущена в режиме без отладки, нажмите клавишу F5 для запуска в режиме отладки.
    • Если среда VS была запущена в режиме отладки, остановите отладчик и нажмите клавишу F5.

В приложении будут отображены данные.

Приложение MVC Movie, открытое в Microsoft Edge и отображающие данные о фильме