Часть 2. Добавление модели в приложение Razor Pages в ASP.NET Core

Примечание.

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

Внимание

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

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

В этом учебнике добавляются классы для управления фильмами в базе данных. Классы моделей приложения используют Entity Framework Core (EF Core) для работы с базой данных. EF Core — это реляционная схема объектов (O/RM), которая упрощает доступ к данным. Сначала вы записываете классы модели и EF Core создаете базу данных.

Классы модели называются классами POCO (от P lain-O ld CLR O bjects), так как они не имеют зависимостиEF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.

Добавление модели данных

  1. В Обозревателе решений щелкните правой кнопкой мыши проект RazorPagesMovie и выберите Добавить>New Folder (Новая папка). Назовите папку Models.

  2. Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.

  3. Добавьте в класс Movie следующие свойства:

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Класс Movie содержит:

  • Поле ID является обязательным для первичного ключа базы данных.

  • Атрибут [DataType], указывающий тип данных в свойстве ReleaseDate. С этим атрибутом:

    • Пользователю не требуется вводить сведения о времени в поле даты.
    • Отображается только дата, а не время.
  • Знак вопроса после string указывает, что свойство допускает значение NULL. Дополнительные сведения см. в статье Ссылочные типы, допускающие значение NULL.

DataAnnotations рассматриваются в следующем руководстве.

Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.

Создание модели фильма

В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.

  1. Создайте папку Pages/Movies.

    1. Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
    2. Назовите папку Movies.
  2. Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolded Item (Создать шаблонный элемент).

    Создание шаблонного элемента

  3. В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD)>Добавить.

    Добавление шаблона

  4. Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):

    1. В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models).
    2. В строке Класс контекста данных щелкните знак плюса (+).
      1. В диалоговом окне Добавление контекста данных будет сгенерировано имя класса RazorPagesMovie.Data.RazorPagesMovieContext.
      2. В раскрывающемся списке поставщика базы данных выберите SQL Server.
    3. Выберите Добавить.

    Добавление Razor страниц

Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.

Созданные и обновленные файлы

В процессе формирования шаблонов создаются указанные ниже файлы.

  • Pages/Movies: Create, Delete, Details, Edit и Index.
  • Data/RazorPagesMovieContext.cs

В следующем учебнике приводится описание созданных файлов.

Процесс формирования шаблонов добавляет в файл следующий выделенный Program.cs код:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/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.MapRazorPages();

app.Run();

Изменения Program.cs описаны далее в этом руководстве.

Создание начальной схемы базы данных с помощью функции миграции EF

Функция миграции в Entity Framework Core предоставляет следующие возможности:

  • Создание начальной схемы базы данных.
  • Поэтапное обновление схемы базы данных, чтобы она соответствовала модели данных приложения. Существующие данные в базе данных сохраняются.

В этом разделе окно Консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:

  • Добавления первоначальной миграции.
  • Обновления базы данных с помощью первоначальной миграции.
  1. В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

    Меню PMC

  2. В PMC введите следующие команды:

    Add-Migration InitialCreate
    Update-Database
    
  • Команда Add-Migration формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграции. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.

  • Команда Update-Database выполняет метод Up в миграциях, которые не были применены. В этом случае команда запускает Up метод в Migrations/<time-stamp>_InitialCreate.cs файле, который создает базу данных.

Появится следующее предупреждение, которое будет устранено на следующем шаге:

"Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения".

Контекст данных RazorPagesMovieContext:

  • Получается из Microsoft.EntityFrameworkCore.DbContext.
  • Указывает сущности, которые включаются в модель данных.
  • Координаты EF Core функций, таких как создание, чтение, обновление и удаление модели Movie .
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

Представленный выше код создает свойство DbSet<Movie> для набора сущностей. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных. Сущность соответствует строке в таблице.

Имя строки подключения передается в контекст путем вызова метода для объекта DbContextOptions. При локальной разработке система конфигурации считывает строку подключения из файла appsettings.json.

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

  1. Запустите приложение и добавьте /Movies к URL-адресу в браузере (http://localhost:port/movies).

    Если вы получите следующую ошибку:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Вы пропустили шаг миграции.

  2. Протестируйте ссылку Create New (Создать).

    Создание страницы

    Примечание.

    В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.

  3. Проверьте ссылки Изменить, Сведения и Удалить.

В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.

Проверка контекста, зарегистрированного с помощью внедрения зависимостей

ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как EF Core контекст базы данных, регистрируются при внедрении зависимостей во время запуска приложения. Затем компоненты, которые используют эти службы (например, Razor Pages), предоставляются через параметры конструктора. Код конструктора, который получает экземпляр контекста базы данных, приведен далее в этом руководстве.

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

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/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.MapRazorPages();

app.Run();

Устранение неполадок с завершенным примером

Если вы столкнулись с проблемой, которую не можете решить, сравните свой код с кодом готового проекта. Просмотрите или скачайте завершенный проект (порядок загрузки).

Следующие шаги

В этом учебнике добавляются классы для управления фильмами в базе данных. Классы моделей приложения используют Entity Framework Core (EF Core) для работы с базой данных. EF Core — это реляционная схема объектов (O/RM), которая упрощает доступ к данным. Сначала вы записываете классы модели и EF Core создаете базу данных.

Классы модели называются классами POCO (от P lain-O ld CLR O bjects), так как они не имеют зависимостиEF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.

Добавление модели данных

  1. В Обозревателе решений щелкните правой кнопкой мыши проект RazorPagesMovie и выберите Добавить>New Folder (Новая папка). Назовите папку Models.

  2. Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.

  3. Добавьте в класс Movie следующие свойства:

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Класс Movie содержит:

  • Поле ID является обязательным для первичного ключа базы данных.

  • Атрибут [DataType], указывающий тип данных в свойстве ReleaseDate. С этим атрибутом:

    • Пользователю не требуется вводить сведения о времени в поле даты.
    • Отображается только дата, а не время.
  • Знак вопроса после string указывает, что свойство допускает значение NULL. Дополнительные сведения см. в статье Ссылочные типы, допускающие значение NULL.

DataAnnotations рассматриваются в следующем руководстве.

Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.

Создание модели фильма

В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.

  1. Создайте папку Pages/Movies.

    1. Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
    2. Назовите папку Movies.
  2. Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolded Item (Создать шаблонный элемент).

    Создание шаблонного элемента

  3. В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD)>Добавить.

    Добавление шаблона

  4. Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):

    1. В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models).
    2. В строке Класс контекста данных щелкните знак плюса (+).
      1. В диалоговом окне Добавление контекста данных будет сгенерировано имя класса RazorPagesMovie.Data.RazorPagesMovieContext.
      2. В раскрывающемся списке поставщика базы данных выберите SQL Server.
    3. Выберите Добавить.

    Добавление Razor страниц

Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.

Созданные и обновленные файлы

В процессе формирования шаблонов создаются указанные ниже файлы.

  • Pages/Movies: Create, Delete, Details, Edit и Index.
  • Data/RazorPagesMovieContext.cs

В следующем учебнике приводится описание созданных файлов.

Процесс формирования шаблонов добавляет в файл следующий выделенный Program.cs код:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/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.MapRazorPages();

app.Run();

Изменения Program.cs описаны далее в этом руководстве.

Создание начальной схемы базы данных с помощью функции миграции EF

Функция миграции в Entity Framework Core предоставляет следующие возможности:

  • Создание начальной схемы базы данных.
  • Поэтапное обновление схемы базы данных, чтобы она соответствовала модели данных приложения. Существующие данные в базе данных сохраняются.

В этом разделе окно Консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:

  • Добавления первоначальной миграции.
  • Обновления базы данных с помощью первоначальной миграции.
  1. В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

    Меню PMC

  2. В PMC введите следующие команды:

    Add-Migration InitialCreate
    Update-Database
    
  • Команда Add-Migration формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграции. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.

  • Команда Update-Database выполняет метод Up в миграциях, которые не были применены. В этом случае команда запускает Up метод в Migrations/<time-stamp>_InitialCreate.cs файле, который создает базу данных.

Появится следующее предупреждение, которое будет устранено на следующем шаге:

"Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения".

Контекст данных RazorPagesMovieContext:

  • Получается из Microsoft.EntityFrameworkCore.DbContext.
  • Указывает сущности, которые включаются в модель данных.
  • Координаты EF Core функций, таких как создание, чтение, обновление и удаление модели Movie .
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

Представленный выше код создает свойство DbSet<Movie> для набора сущностей. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных. Сущность соответствует строке в таблице.

Имя строки подключения передается в контекст путем вызова метода для объекта DbContextOptions. При локальной разработке система конфигурации считывает строку подключения из файла appsettings.json.

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

  1. Запустите приложение и добавьте /Movies к URL-адресу в браузере (http://localhost:port/movies).

    Если вы получите следующую ошибку:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Вы пропустили шаг миграции.

  2. Протестируйте ссылку Create New (Создать).

    Создание страницы

    Примечание.

    В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.

  3. Проверьте ссылки Изменить, Сведения и Удалить.

В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.

Проверка контекста, зарегистрированного с помощью внедрения зависимостей

ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как EF Core контекст базы данных, регистрируются при внедрении зависимостей во время запуска приложения. Затем компоненты, которые используют эти службы (например, Razor Pages), предоставляются через параметры конструктора. Код конструктора, который получает экземпляр контекста базы данных, приведен далее в этом руководстве.

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

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/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.MapRazorPages();

app.Run();

Устранение неполадок с завершенным примером

Если вы столкнулись с проблемой, которую не можете решить, сравните свой код с кодом готового проекта. Просмотрите или скачайте завершенный проект (порядок загрузки).

Следующие шаги

В этом учебнике добавляются классы для управления фильмами в базе данных. Классы моделей приложения используют Entity Framework Core (EF Core) для работы с базой данных. EF Core — это реляционная схема объектов (O/RM), которая упрощает доступ к данным. Сначала вы записываете классы модели и EF Core создаете базу данных.

Классы модели называются классами POCO (от P lain-O ld CLR O bjects), так как они не имеют зависимостиEF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.

Добавление модели данных

  1. В Обозревателе решений щелкните правой кнопкой мыши проект RazorPagesMovie и выберите Добавить>New Folder (Новая папка). Назовите папку Models.

  2. Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.

  3. Добавьте в класс Movie следующие свойства:

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; } = string.Empty;
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; } = string.Empty;
            public decimal Price { get; set; }
        }
    }
    

Класс Movie содержит:

  • Поле ID является обязательным для первичного ключа базы данных.

  • Атрибут [DataType], указывающий тип данных в свойстве ReleaseDate. С этим атрибутом:

    • Пользователю не требуется вводить сведения о времени в поле даты.
    • Отображается только дата, а не время.

DataAnnotations рассматриваются в следующем руководстве.

Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.

Создание модели фильма

В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.

  1. Добавьте пакет NuGet Microsoft.EntityFrameworkCore.Design, который необходим для средства формирования шаблонов.

    1. В меню "Сервис" выберите NuGet диспетчер пакетов> Manage NuGet Packages for SolutionNuGet диспетчер пакетов — управление
    2. Откройте вкладку Browse (Обзор).
    3. Введите Microsoft.EntityFrameworkCore.Design и выберите его из списка.
    4. Установите флажок Проект и выберите Установить.
    5. Нажмите кнопку Принимаю в диалоговом окне Принятие условий лицензионного соглашения. Диспетчер пакетов NuGet: добавление пакета
  2. Создайте папку Pages/Movies.

    1. Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
    2. Назовите папку Movies.
  3. Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolded Item (Создать шаблонный элемент).

    Создание шаблонного элемента

  4. В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD)>Добавить.

    Добавление шаблона

  5. Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):

    1. В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models).
    2. В строке Класс контекста данных щелкните знак плюса (+).
      1. В диалоговом окне Добавление контекста данных будет сгенерировано имя класса RazorPagesMovie.Data.RazorPagesMovieContext.
    3. Выберите Добавить.

    Добавление Razor страниц

    Если появляется сообщение об ошибке, в котором говорится о необходимости установить пакет Microsoft.EntityFrameworkCore.SqlServer, повторите действия, начиная с шага Добавить>New Scaffolded Item (Создать шаблонный элемент).

Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.

Созданные и обновленные файлы

В процессе формирования шаблонов создаются указанные ниже файлы.

  • Pages/Movies: Create, Delete, Details, Edit и Index.
  • Data/RazorPagesMovieContext.cs

В следующем учебнике приводится описание созданных файлов.

Процесс формирования шаблонов добавляет в файл следующий выделенный Program.cs код:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/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.MapRazorPages();

app.Run();

Изменения Program.cs описаны далее в этом руководстве.

Создание начальной схемы базы данных с помощью функции миграции EF

Функция миграции в Entity Framework Core предоставляет следующие возможности:

  • Создание начальной схемы базы данных.
  • Поэтапное обновление схемы базы данных, чтобы она соответствовала модели данных приложения. Существующие данные в базе данных сохраняются.

В этом разделе окно Консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:

  • Добавления первоначальной миграции.
  • Обновления базы данных с помощью первоначальной миграции.
  1. В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

    Меню PMC

  2. В PMC введите следующие команды:

    Add-Migration InitialCreate
    Update-Database
    
    

Предыдущие команды устанавливают средства Entity Framework Core и выполняют команду migrations для создания кода, который создает исходную схему базы данных.

Появится следующее предупреждение, которое будет устранено на следующем шаге:

"Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения".

Команда migrations формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграциям. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.

Команда update выполняет метод Up в миграциях, которые не были применены. В этом случае update выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.

Проверка контекста, зарегистрированного с помощью внедрения зависимостей

ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как EF Core контекст базы данных, регистрируются при внедрении зависимостей во время запуска приложения. Затем компоненты, которые используют эти службы (например, Razor Pages), предоставляются через параметры конструктора. Код конструктора, который получает экземпляр контекста базы данных, приведен далее в этом руководстве.

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

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/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.MapRazorPages();

app.Run();

Контекст данных RazorPagesMovieContext:

  • Получается из Microsoft.EntityFrameworkCore.DbContext.
  • Указывает сущности, которые включаются в модель данных.
  • Координаты EF Core функций, таких как создание, чтение, обновление и удаление модели Movie .
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
    }
}

Представленный выше код создает свойство DbSet<Movie> для набора сущностей. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных. Сущность соответствует строке в таблице.

Имя строки подключения передается в контекст путем вызова метода для объекта DbContextOptions. При локальной разработке система конфигурации считывает строку подключения из файла appsettings.json.

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

  1. Запустите приложение и добавьте /Movies к URL-адресу в браузере (http://localhost:port/movies).

    Если вы получите следующую ошибку:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Вы пропустили шаг миграции.

  2. Протестируйте ссылку Create New (Создать).

    Создание страницы

    Примечание.

    В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.

  3. Проверьте ссылки Изменить, Сведения и Удалить.

В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.

Устранение неполадок с завершенным примером

Если вы столкнулись с проблемой, которую не можете решить, сравните свой код с кодом готового проекта. Просмотрите или скачайте завершенный проект (порядок загрузки).

Следующие шаги

В этом разделе добавляются классы для управления фильмами в базе данных. Классы моделей приложения используют Entity Framework Core (EF Core) для работы с базой данных. EF Core — это реляционная схема объектов (O/RM), которая упрощает доступ к данным. Сначала вы записываете классы модели и EF Core создаете базу данных.

Классы модели называются классами POCO (от P lain-O ld CLR O bjects), так как они не имеют зависимостиEF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.

Просмотреть или скачать пример кода (описание скачивания).

Добавление модели данных

  1. В Обозревателе решений щелкните правой кнопкой мыши проект RazorPagesMovie и выберите Добавить>New Folder (Новая папка). Назовите папку Models.

  2. Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.

  3. Добавьте в класс Movie следующие свойства:

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
        }
    }
    

Класс Movie содержит:

  • Поле ID является обязательным для первичного ключа базы данных.

  • [DataType(DataType.Date)]: Атрибут [DataType] указывает тип данных (Date). С этим атрибутом:

    • Пользователю не требуется вводить сведения о времени в поле даты.
    • Отображается только дата, а не время.

DataAnnotations рассматриваются в следующем руководстве.

Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.

Создание модели фильма

В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.

  1. Создайте папку Pages/Movies:

    1. Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
    2. Назовите папку Movies.
  2. Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolded Item (Создать шаблонный элемент).

    Создание шаблонного элемента

  3. В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD)>Добавить.

    Добавление шаблона

  4. Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):

    1. В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models).
    2. В строке Класс контекста данных щелкните знак плюса (+).
      1. В диалоговом окне Добавление контекста данных будет сгенерировано имя класса RazorPagesMovie.Data.RazorPagesMovieContext.
    3. Выберите Добавить.

    Добавление Razor страниц

Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.

Созданные и обновленные файлы

В процессе формирования шаблонов создаются указанные ниже файлы.

  • Pages/Movies: Create, Delete, Details, Edit и Index.
  • Data/RazorPagesMovieContext.cs

Обновленные файлы

  • Startup.cs

В следующем разделе приводится описание созданных и обновленных файлов.

Создание начальной схемы базы данных с помощью функции миграции EF

Функция миграции в Entity Framework Core предоставляет следующие возможности:

  • Создание начальной схемы базы данных.
  • Поэтапное обновление схемы базы данных, чтобы она соответствовала модели данных приложения. Существующие данные в базе данных сохраняются.

В этом разделе окно Консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:

  • Добавления первоначальной миграции.
  • Обновления базы данных с помощью первоначальной миграции.
  1. В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

    Меню PMC

  2. В PMC введите следующие команды:

    Add-Migration InitialCreate
    Update-Database
    

Для SQL Server в результате выполнения предыдущих команд выводится следующее предупреждение: "Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода 'HasColumnType()' явно укажите тип столбца SQL Server, который может вместить все значения".

Пропустите это предупреждение, так как оно будет рассмотрено на более позднем этапе.

Команда migrations формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграциям. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.

Команда update выполняет метод Up в миграциях, которые не были применены. В этом случае update выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.

Проверка контекста, зарегистрированного с помощью внедрения зависимостей

ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как EF Core контекст базы данных, регистрируются при внедрении зависимостей во время запуска приложения. Затем компоненты, которые используют эти службы (например, Razor Pages), предоставляются через параметры конструктора. Код конструктора, который получает экземпляр контекста базы данных, приведен далее в этом руководстве.

Средство формирования шаблонов автоматически создает контекст базы данных и регистрирует его с использованием контейнера внедрения зависимостей.

Проверьте метод Startup.ConfigureServices. Средством формирования шаблонов была добавлена выделенная строка:

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

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

Функции RazorPagesMovieContext координат EF Core , такие как создание, чтение, обновление и удаление модели Movie . Контекст данных (RazorPagesMovieContext) получен из Microsoft.EntityFrameworkCore.DbContext. Контекст данных указывает сущности, которые включаются в модель данных.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Представленный выше код создает свойство DbSet<Movie> для набора сущностей. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных. Сущность соответствует строке в таблице.

Имя строки подключения передается в контекст путем вызова метода для объекта DbContextOptions. При локальной разработке система конфигурации считывает строку подключения из файла appsettings.json.

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

  1. Запустите приложение и добавьте /Movies к URL-адресу в браузере (http://localhost:port/movies).

    Если вы получите следующую ошибку:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Вы пропустили шаг миграции.

  2. Протестируйте ссылку Создать.

    Создание страницы

    Примечание.

    В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.

  3. Проверьте ссылки Изменить, Сведения и Удалить.

Ведение журнала SQL Entity Framework Core

Конфигурация ведения журналов обычно предоставляется разделом Logging в файлах appsettings.{Environment}.json. Чтобы регистрировать инструкции SQL, добавьте "Microsoft.EntityFrameworkCore.Database.Command": "Information" в файл appsettings.Development.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}

При использовании приведенного выше кода JSON инструкции SQL отображаются в командной строке и в окне вывода Visual Studio.

Дополнительные сведения см. в статье Ведение журнала в ASP.NET Core и описании этой проблемы GitHub.

В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.

Следующие шаги

В этом разделе добавляются классы для управления фильмами. Классы моделей приложения используют Entity Framework Core (EF Core) для работы с базой данных. EF Core — это реляционная схема объектов (O/RM), которая упрощает доступ к данным.

Классы модели называются классами POCO (из "обычных объектов CLR"), так как они не имеют никакой зависимости EF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.

Просмотреть или скачать пример кода (описание скачивания).

Добавление модели данных

Щелкните проект RazorPagesMovie правой кнопкой мыши и выберите Добавить>New Folder (Новая папка). Назовите папку Models.

Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.

Добавьте в класс Movie следующие свойства:

using System;
using System.ComponentModel.DataAnnotations;

namespace RazorPagesMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Класс Movie содержит:

  • Поле ID является обязательным для первичного ключа базы данных.

  • [DataType(DataType.Date)]: Атрибут DataType указывает тип данных (Date). С этим атрибутом:

    • пользователю не требуется вводить сведения о времени в поле даты.
    • Отображается только дата, а не время.

DataAnnotations рассматриваются в следующем руководстве.

DataAnnotations рассматриваются в следующем руководстве.

Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.

Создание модели фильма

В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.

Создайте папку Pages/Movies:

  • Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
  • Назовите папку Movies.

Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolded Item (Создать шаблонный элемент).

Создание шаблонного элемента в VScode

В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD)>Добавить.

Добавление шаблона в VScode

Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):

  • В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models).
  • В строке Класс контекста данных щелкните значок плюса + и измените созданное имя с RazorPagesMovie.Models.RazorPagesMovieContext на RazorPagesMovie.Data.RazorPagesMovieContext. Это изменение не требуется. Оно создает класс контекста базы данных с правильным пространством имен.
  • Выберите Добавить.

Добавление Razor страниц в VScode

Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.

Создаваемые файлы

В процессе формирования шаблонов создаются и обновляются указанные ниже файлы.

  • Pages/Movies: Create, Delete, Details, Edit и Index.
  • Data/RazorPagesMovieContext.cs

Обновлено

  • Startup.cs

В следующем разделе приводится описание созданных и обновленных файлов.

Первоначальная миграция

В этом разделе консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:

  • Добавления первоначальной миграции.
  • Обновления базы данных с помощью первоначальной миграции.

В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

Меню PMC

В PMC введите следующие команды:

Add-Migration InitialCreate
Update-Database

Приведенные выше команды создают следующее предупреждение: "Тип не указан для десятичного столбца "Цена" в типе сущности Movie. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода 'HasColumnType()' явно укажите тип столбца SQL Server, который может вместить все значения".

Пропустите это предупреждение, так как оно будет рассмотрено на более позднем этапе.

Команда миграции формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграциям. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.

Команда update выполняет метод Up в миграциях, которые не были применены. В этом случае update выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.

Проверка контекста, зарегистрированного с помощью внедрения зависимостей

ASP.NET Core поддерживает внедрение зависимостей. Службы, такие как EF Core контекст базы данных, регистрируются при внедрении зависимостей во время запуска приложения. Затем компоненты, которые используют эти службы, например Razor Pages, предоставляются через параметры конструктора. Код конструктора, который получает экземпляр контекста базы данных, приведен далее в этом руководстве.

Средство формирования шаблонов автоматически создает контекст базы данных и регистрирует его с использованием контейнера внедрения зависимостей.

Проверьте метод Startup.ConfigureServices. Средством формирования шаблонов была добавлена выделенная строка:

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

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

Функции RazorPagesMovieContext координат EF Core , такие как создание, чтение, обновление и удаление модели Movie . Контекст данных (RazorPagesMovieContext) получен из Microsoft.EntityFrameworkCore.DbContext. Контекст данных указывает сущности, которые включаются в модель данных.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Представленный выше код создает свойство DbSet<Movie> для набора сущностей. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных. Сущность соответствует строке в таблице.

Имя строки подключения передается в контекст путем вызова метода для объекта DbContextOptions. При локальной разработке система конфигурации считывает строку подключения из файла appsettings.json.

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

  • Запустите приложение и добавьте /Movies к URL-адресу в браузере (http://localhost:port/movies).

Если возникает ошибка:

SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.

Вы пропустили шаг миграции.

  • Протестируйте ссылку Создать.

    Создание страницы

    Примечание.

    В поле Price нельзя вводить десятичные запятые. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения. Инструкции по глобализации см. на сайте GitHub.

  • Проверьте ссылки Изменить, Сведения и Удалить.

В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.

Следующие шаги