Часть 2. Добавление модели в приложение Razor Pages в ASP.NET CorePart 2, add a model to a Razor Pages app in ASP.NET Core

Автор: Рик Андерсон (Rick Anderson)By Rick Anderson

В этом разделе добавляются классы для управления фильмами.In this section, classes are added for managing movies. Классы модели приложения используются в Entity Framework Core (EF Core) для работы с базой данных.The app's model classes use Entity Framework Core (EF Core) to work with the database. EF Core —это объектно-реляционный сопоставитель (ORM), упрощающий получение доступа к данным.EF Core is an object-relational mapper (O/RM) that simplifies data access.

Эти классы моделей называются классами POCO (от plain old CLR objects — "старые добрые объекты CLR"), так как они не зависят от EF Core.The model classes are known as POCO classes (from "plain-old CLR objects") because they don't have any dependency on EF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.They define the properties of the data that are stored in the database.

Добавление модели данныхAdd a data model

Щелкните проект RazorPagesMovie правой кнопкой мыши и выберите пункт Добавить > Новая папка.Right-click the RazorPagesMovie project > Add > New Folder. Присвойте папке имя Models.Name the folder Models.

Щелкните правой кнопкой мыши папку Models.Right click the Models folder. Выберите Добавить > Класс.Select Add > Class. Присвойте классу имя Movie.Name the class Movie.

Добавьте в класс Movie следующие свойства:Add the following properties to the Movie class:

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 содержит:The Movie class contains:

  • Поле ID является обязательным для первичного ключа базы данных.The ID field is required by the database for the primary key.

  • [DataType(DataType.Date)]. Атрибут DataType указывает тип данных (Date).[DataType(DataType.Date)]: The DataType attribute specifies the type of the data (Date). С этим атрибутом:With this attribute:

    • пользователю не требуется вводить сведения о времени в поле даты.The user is not required to enter time information in the date field.
    • Отображается только дата, а не время.Only the date is displayed, not time information.

DataAnnotations рассматриваются в следующем руководстве.DataAnnotations are covered in a later tutorial.

Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.Build the project to verify there are no compilation errors.

Создание модели фильмаScaffold the movie model

В этом разделе создается модель фильма.In this section, the movie model is scaffolded. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.That is, the scaffolding tool produces pages for Create, Read, Update, and Delete (CRUD) operations for the movie model.

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

  • Щелкните правой кнопкой мыши папку Pages и выберите Добавить > Новая папка.Right click on the Pages folder > Add > New Folder.
  • Назовите папку MoviesName the folder Movies

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

Изображение из предыдущих инструкций.

В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD) > Добавить.In the Add Scaffold dialog, select Razor Pages using Entity Framework (CRUD) > Add.

Изображение из предыдущих инструкций.

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

  • В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models) .In the Model class drop down, select Movie (RazorPagesMovie.Models).
  • В строке Класс контекста данных щелкните значок плюса + и измените сгенерированное имя RazorPagesMovie.Models.RazorPagesMovieContext на RazorPagesMovie.Data.RazorPagesMovieContext.In the Data context class row, select the + (plus) sign and change the generated name from RazorPagesMovie.Models.RazorPagesMovieContext to RazorPagesMovie.Data.RazorPagesMovieContext. Это изменение не требуется.This change is not required. Оно создает класс контекста базы данных с правильным пространством имен.It creates the database context class with the correct namespace.
  • Нажмите Добавить.Select Add.

Изображение из предыдущих инструкций.

Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.The appsettings.json file is updated with the connection string used to connect to a local database.

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

В процессе формирования шаблонов создаются и обновляются указанные ниже файлы.The scaffold process creates and updates the following files:

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

Обновленные возможностиUpdated

  • Startup.csStartup.cs

В следующем разделе приводится описание созданных и обновленных файлов.The created and updated files are explained in the next section.

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

В этом разделе консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:In this section, the Package Manager Console (PMC) is used to:

  • Добавления первоначальной миграции.Add an initial migration.
  • Обновления базы данных с помощью первоначальной миграции.Update the database with the initial migration.

В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet > Консоль диспетчера пакетов.From the Tools menu, select NuGet Package Manager > Package Manager Console.

Меню PMC

В PMC введите следующие команды:In the PMC, enter the following commands:

Add-Migration InitialCreate
Update-Database

В результате выполнения предыдущих команд выводится следующее предупреждение: "Для десятичного столбца Price в типе сущности Movie не указан тип.The preceding commands generate the following warning: "No type was specified for the decimal column 'Price' on entity type 'Movie'. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию.This will cause values to be silently truncated if they do not fit in the default precision and scale. С помощью метода 'HasColumnType()' явно укажите тип столбца SQL Server, который может вместить все значения".Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'."

Это предупреждение можно игнорировать. Оно будет устранено в следующем руководстве.You can ignore that warning, it will be fixed in a later tutorial.

Команда миграции формирует код для создания схемы исходной базы данных.The migrations command generates code to create the initial database schema. Схема создается на основе модели, указанной в DbContext.The schema is based on the model specified in DbContext. Аргумент InitialCreate используется для присвоения имен миграциям.The InitialCreate argument is used to name the migrations. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.Any name can be used, but by convention a name is selected that describes the migration.

Команда update выполняет метод Up в миграциях, которые не были применены.The update command runs the Up method in migrations that have not been applied. В этом случае update запускает метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.In this case, update runs the Up method in Migrations/<time-stamp>_InitialCreate.cs file, which creates the database.

Проверка контекста, зарегистрированного с помощью внедрения зависимостейExamine the context registered with dependency injection

ASP.NET Core поддерживает внедрение зависимостей.ASP.NET Core is built with dependency injection. С помощью внедрения зависимостей службы (например, контекст базы данных EF Core) регистрируются во время запуска приложения.Services (such as the EF Core DB context) are registered with dependency injection during application startup. Затем компоненты, которые используют эти службы (например, Razor Pages), обращаются к ним через параметры конструктора.Components that require these services (such as Razor Pages) are provided these services via constructor parameters. Код конструктора, который получает экземпляр контекста базы данных, приведен далее в этом руководстве.The constructor code that gets a DB context instance is shown later in the tutorial.

Средство формирования шаблонов автоматически создает контекст базы данных и регистрирует его с использованием контейнера внедрения зависимостей.The scaffolding tool automatically created a DB context and registered it with the dependency injection container.

Проверьте метод Startup.ConfigureServices.Examine the Startup.ConfigureServices method. Средством формирования шаблонов была добавлена выделенная строка:The highlighted line was added by the scaffolder:

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

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

RazorPagesMovieContext координирует функции EF Core (Create, Read, Update, Delete и т. д.) для модели Movie.The RazorPagesMovieContext coordinates EF Core functionality (Create, Read, Update, Delete, etc.) for the Movie model. Контекст данных (RazorPagesMovieContext) получен из Microsoft.EntityFrameworkCore.DbContext.The data context (RazorPagesMovieContext) is derived from Microsoft.EntityFrameworkCore.DbContext. Контекст данных указывает сущности, которые включаются в модель данных.The data context specifies which entities are included in the data model.

using Microsoft.EntityFrameworkCore;

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

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

Представленный выше код создает свойство DbSet<Movie> для набора сущностей.The preceding code creates a DbSet<Movie> property for the entity set. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных.In Entity Framework terminology, an entity set typically corresponds to a database table. Сущность соответствует строке в таблице.An entity corresponds to a row in the table.

Имя строки подключения передается в контекст путем вызова метода для объекта DbContextOptions.The name of the connection string is passed in to the context by calling a method on a DbContextOptions object. При локальной разработке система конфигурации ASP.NET Core считывает строку подключения из файла appsettings.json.For local development, the ASP.NET Core configuration system reads the connection string from the appsettings.json file.

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

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

Если возникает ошибка.If you get the error:

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

Вы пропустили шаг миграции.You missed the migrations step.

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

    Страница "Создать"

    Примечание

    В поле Price нельзя вводить десятичные запятые.You may not be able to enter decimal commas in the Price field. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения.To support jQuery validation for non-English locales that use a comma (",") for a decimal point and for non US-English date formats, the app must be globalized. Инструкции по глобализации см. на сайте GitHub.For globalization instructions, see this GitHub issue.

  • Протестируйте ссылки Изменить, Сведения и Удалить.Test the Edit, Details, and Delete links.

В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.The next tutorial explains the files created by scaffolding.

Дополнительные ресурсыAdditional resources

В этом разделе добавляются классы для управления фильмами в кроссплатформенной базе данных SQLite.In this section, classes are added for managing movies in a cross-platform SQLite database. Приложения, созданные на основе шаблона ASP.NET Core, используют базу данных SQLite.Apps created from an ASP.NET Core template use a SQLite database. Эти классы этой модели приложений используются в Entity Framework Core (EF Core) (SQLite EF Core Database Provider) для работы с базой данных.The app's model classes are used with Entity Framework Core (EF Core) (SQLite EF Core Database Provider) to work with the database. EF Core —это платформа объектно-реляционного сопоставления (ORM), которая упрощает получение доступа к данным.EF Core is an object-relational mapping (ORM) framework that simplifies data access.

Эти классы моделей называются классами POCO (от plain old CLR objects — "старые добрые объекты CLR"), так как они не зависят от EF Core.The model classes are known as POCO classes (from "plain-old CLR objects") because they don't have any dependency on EF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.They define the properties of the data that are stored in the database.

Добавление модели данныхAdd a data model

Щелкните проект RazorPagesMovie правой кнопкой мыши и выберите пункт Добавить > Новая папка.Right-click the RazorPagesMovie project > Add > New Folder. Присвойте папке имя Models.Name the folder Models.

Щелкните правой кнопкой мыши папку Models.Right click the Models folder. Выберите Добавить > Класс.Select Add > Class. Присвойте классу имя Movie.Name the class Movie.

Добавьте в класс Movie следующие свойства:Add the following properties to the Movie class:

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 содержит:The Movie class contains:

  • Поле ID является обязательным для первичного ключа базы данных.The ID field is required by the database for the primary key.

  • [DataType(DataType.Date)]. Атрибут DataType указывает тип данных (Date).[DataType(DataType.Date)]: The DataType attribute specifies the type of the data (Date). С этим атрибутом:With this attribute:

    • пользователю не требуется вводить сведения о времени в поле даты.The user is not required to enter time information in the date field.
    • Отображается только дата, а не время.Only the date is displayed, not time information.

DataAnnotations рассматриваются в следующем руководстве.DataAnnotations are covered in a later tutorial.

Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.Build the project to verify there are no compilation errors.

Создание модели фильмаScaffold the movie model

В этом разделе создается модель фильма.In this section, the movie model is scaffolded. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.That is, the scaffolding tool produces pages for Create, Read, Update, and Delete (CRUD) operations for the movie model.

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

  • Щелкните правой кнопкой мыши папку Pages и выберите Добавить > Новая папка.Right click on the Pages folder > Add > New Folder.
  • Назовите папку MoviesName the folder Movies

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

Изображение из предыдущих инструкций.

В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD) > Добавить.In the Add Scaffold dialog, select Razor Pages using Entity Framework (CRUD) > Add.

Изображение из предыдущих инструкций.

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

  • В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models) .In the Model class drop down, select Movie (RazorPagesMovie.Models).
  • В строке Класс контекста данных нажмите на значок плюса + и примите сгенерированное имя RazorPagesMovie.Models.RazorPagesMovieContext.In the Data context class row, select the + (plus) sign and accept the generated name RazorPagesMovie.Models.RazorPagesMovieContext.
  • Нажмите Добавить.Select Add.

Изображение из предыдущих инструкций.

Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.The appsettings.json file is updated with the connection string used to connect to a local database.

В процессе формирования шаблонов создаются и обновляются указанные ниже файлы.The scaffold process creates and updates the following files:

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

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

Обновляемые файлыFile updated

  • Startup.csStartup.cs

В следующем разделе приводится описание созданных и обновленных файлов.The created and updated files are explained in the next section.

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

В этом разделе консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:In this section, the Package Manager Console (PMC) is used to:

  • Добавления первоначальной миграции.Add an initial migration.
  • Обновления базы данных с помощью первоначальной миграции.Update the database with the initial migration.

В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet > Консоль диспетчера пакетов.From the Tools menu, select NuGet Package Manager > Package Manager Console.

Меню PMC

В PMC введите следующие команды:In the PMC, enter the following commands:

Add-Migration Initial
Update-Database

Команда Add-Migration формирует код для создания схемы исходной базы данных.The Add-Migration command generates code to create the initial database schema. Схема создается на основе модели, указанной в DbContext (в файле RazorPagesMovieContext.cs).The schema is based on the model specified in the DbContext (In the RazorPagesMovieContext.cs file). Аргумент InitialCreate используется для присвоения имен миграции.The InitialCreate argument is used to name the migration. Можно использовать любое имя, однако по соглашению используется имя, которое описывает миграцию.Any name can be used, but by convention a name that describes the migration is used. Для получения дополнительной информации см. Руководство по Использование ASP.NET MVC с EF Core. Функции миграций.For more information, see Руководство по Использование ASP.NET MVC с EF Core. Функции миграций.

Команда Update-Database выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs.The Update-Database command runs the Up method in the Migrations/<time-stamp>_InitialCreate.cs file. Метод Up создает базу данных.The Up method creates the database.

Примечание

В результате выполнения предыдущих команд выводится следующее предупреждение: "Для десятичного столбца "Price" в типе сущности "Movie" не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода "HasColumnType()" явно укажите тип столбца SQL Server, который может вместить все значения. " Вы можете игнорировать это предупреждение, оно будет исправлено в следующем учебнике.The preceding commands generate the following warning: "No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'." You can ignore that warning, it will be fixed in a later tutorial.

Проверка контекста, зарегистрированного с помощью внедрения зависимостейExamine the context registered with dependency injection

ASP.NET Core поддерживает внедрение зависимостей.ASP.NET Core is built with dependency injection. С помощью внедрения зависимостей службы (например, контекст базы данных EF Core) регистрируются во время запуска приложения.Services (such as the EF Core DB context) are registered with dependency injection during application startup. Затем компоненты, которые используют эти службы (например, Razor Pages), обращаются к ним через параметры конструктора.Components that require these services (such as Razor Pages) are provided these services via constructor parameters. Код конструктора, который получает экземпляр контекста базы данных, приведен далее в этом руководстве.The constructor code that gets a DB context instance is shown later in the tutorial.

Средство формирования шаблонов автоматически создает контекст базы данных и регистрирует его с использованием контейнера внедрения зависимостей.The scaffolding tool automatically created a DB context and registered it with the dependency injection container.

Проверьте метод Startup.ConfigureServices.Examine the Startup.ConfigureServices method. Средством формирования шаблонов была добавлена выделенная строка:The highlighted line was added by the scaffolder:

// This method gets called by the runtime. 
// Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is 
        // needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

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

RazorPagesMovieContext координирует функции EF Core (Create, Read, Update, Delete и т. д.) для модели Movie.The RazorPagesMovieContext coordinates EF Core functionality (Create, Read, Update, Delete, etc.) for the Movie model. Контекст данных (RazorPagesMovieContext) получен из Microsoft.EntityFrameworkCore.DbContext.The data context (RazorPagesMovieContext) is derived from Microsoft.EntityFrameworkCore.DbContext. Контекст данных указывает сущности, которые включаются в модель данных.The data context specifies which entities are included in the data model.

using Microsoft.EntityFrameworkCore;

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

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

Представленный выше код создает свойство DbSet<Movie> для набора сущностей.The preceding code creates a DbSet<Movie> property for the entity set. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных.In Entity Framework terminology, an entity set typically corresponds to a database table. Сущность соответствует строке в таблице.An entity corresponds to a row in the table.

Имя строки подключения передается в контекст путем вызова метода для объекта DbContextOptions.The name of the connection string is passed in to the context by calling a method on a DbContextOptions object. При локальной разработке система конфигурации ASP.NET Core считывает строку подключения из файла appsettings.json.For local development, the ASP.NET Core configuration system reads the connection string from the appsettings.json file.

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

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

Если возникает ошибка.If you get the error:

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

Вы пропустили шаг миграции.You missed the migrations step.

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

    Страница "Создать"

    Примечание

    В поле Price нельзя вводить десятичные запятые.You may not be able to enter decimal commas in the Price field. Чтобы обеспечить поддержку проверки jQuery для других языков, кроме английского, используйте вместо десятичной точки запятую (,), а для отображения данных в форматах для других языков, кроме английского, выполните глобализацию приложения.To support jQuery validation for non-English locales that use a comma (",") for a decimal point and for non US-English date formats, the app must be globalized. Инструкции по глобализации см. на сайте GitHub.For globalization instructions, see this GitHub issue.

  • Протестируйте ссылки Изменить, Сведения и Удалить.Test the Edit, Details, and Delete links.

В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.The next tutorial explains the files created by scaffolding.

Дополнительные ресурсыAdditional resources