Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в статье о политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 8 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В этом учебнике добавляются классы для управления фильмами в базе данных. Классы моделей приложения используют Entity Framework Core (EF Core) для работы с базой данных. EF Core — это реляционная схема объектов (O/RM), которая упрощает доступ к данным. Сначала вы записываете классы модели и EF Core создаете базу данных.
Классы модели называются классами POCO (от P lain-O ld CLR O bjects), так как они не имеют зависимостиEF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.
В Обозреватель решений щелкните правой кнопкой мыши проект> RazorPagesMovie Add>New Folder. Назовите папку Models.
Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.
Добавьте в класс 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. С этим атрибутом:
Пользователю не требуется вводить сведения о времени в поле даты.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.
Добавьте папку с именем Models.
Добавьте класс в папку Models с именем Movie.cs.
Добавьте в класс 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. С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
В Visual Studio Code нажмите клавиши CTRL+F5 (Windows) или «+F5(macOS), чтобы запустить приложение без отладки.
В области редактора под областью редактора выберите вкладку "ПРОБЛЕМЫ" или в меню "Вид", выберите "Проблемы", если он не находится в режиме. Убедитесь, что ошибки компиляции отсутствуют.
Создание модели фильма
В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В следующем коде демонстрируется выбор строки подключения SQLite в среде разработки и SQL Server в рабочей среде.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
В приведенном выше коде не осуществляется вызов UseDeveloperExceptionPage в среде разработки, поскольку WebApplication вызывает UseDeveloperExceptionPage в режиме разработки.
Созданные и обновленные файлы
В процессе формирования шаблонов создаются указанные ниже файлы.
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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
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.UseSqlite(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.MapStaticAssets();
app.MapRazorPages();
app.Run();
Изменения Program.cs описаны далее в этом руководстве.
Создание начальной схемы базы данных с помощью функции миграции EF
Функция миграции в Entity Framework Core предоставляет следующие возможности:
Создание начальной схемы базы данных.
Поэтапное обновление схемы базы данных, чтобы она соответствовала модели данных приложения. Существующие данные в базе данных сохраняются.
В этом разделе окно Консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:
Добавления первоначальной миграции.
Обновления базы данных с помощью первоначальной миграции.
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
В PMC введите следующую команду:
Add-Migration InitialCreate
Команда Add-Migration формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграции. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.
Появится следующее предупреждение, которое будет устранено на следующем шаге:
"Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения".
В PMC введите следующую команду:
Update-Database
Команда Update-Database выполняет метод Up в миграциях, которые не были применены. В этом случае команда запускает Up метод в Migrations/<time-stamp>_InitialCreate.cs файле, который создает базу данных.
Щелкните правой кнопкой мыши проект RazorPagesMovie.csproj и выберите "Открыть в интегрированном терминале".
Откроется окно терминала с командной строкой в каталоге проекта, который содержит файлы Program.cs и .csproj.
Выполните следующую команду CLI .NET:
dotnet ef migrations add InitialCreate
Команда migrations формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграциям. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.
Выполните следующую команду CLI .NET:
dotnet ef database update
Команда update выполняет метод Up в миграциях, которые не были применены. В этом случае update выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.
Примечание.
Для SQLite для типа столбца для поля Price задается значение TEXT. Это будет решено на более позднем этапе.
Указывает сущности, которые включаются в модель данных.
Координаты EF Core функций, таких как создание, чтение, обновление и удаление модели Movie .
Класс RazorPagesMovieContext в созданном файле Data/RazorPagesMovieContext.cs:
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.
Тестирование приложения
Запустите приложение и добавьте /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.
Проверьте ссылки Изменить, Сведения и Удалить.
В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.
Проверка контекста, зарегистрированного с помощью внедрения зависимостей
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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
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.UseSqlite(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.MapStaticAssets();
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. Эти классы определяют свойства данных, которые хранятся в базе данных.
В Обозреватель решений щелкните правой кнопкой мыши проект> RazorPagesMovie Add>New Folder. Назовите папку Models.
Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.
Добавьте в класс 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. С этим атрибутом:
Пользователю не требуется вводить сведения о времени в поле даты.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.
Добавьте папку с именем Models.
Добавьте класс в папку Models с именем Movie.cs.
Добавьте в класс 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. С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
В Visual Studio Code нажмите клавиши CTRL+F5 (Windows) или «+F5(macOS), чтобы запустить приложение без отладки.
В области редактора под областью редактора выберите вкладку "ПРОБЛЕМЫ" или в меню "Вид", выберите "Проблемы", если он не находится в режиме. Убедитесь, что ошибки компиляции отсутствуют.
В окне средства решения щелкните проект RazorPagesMovie, а затем нажмите кнопку "Добавить>новую папку...". Присвойте папке Modelsимя.
Щелкните папкуModels, а затем нажмите кнопку "Добавить>новый класс...".
В диалоговом окне Новый файл выполните следующие действия.
Выберите на левой панели пункт Общие.
В центральной области выберите Пустой класс.
Назовите класс Movie и выберите Создать.
Добавьте в класс 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. С этим атрибутом:
Пользователю не требуется вводить сведения о времени в поле даты.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.
Создание модели фильма
В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В следующем коде демонстрируется выбор строки подключения SQLite в среде разработки и SQL Server в рабочей среде.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
В приведенном выше коде не осуществляется вызов UseDeveloperExceptionPage в среде разработки, поскольку WebApplication вызывает UseDeveloperExceptionPage в режиме разработки.
Добавьте пакет NuGet Microsoft.EntityFrameworkCore.Sqlite, который необходим для средства формирования шаблонов.
В окне средства решения щелкните проект RazorPagesMovie и выберите "Открыть в терминале".
Откроется окно терминала с командной строкой в каталоге проекта, который содержит файлы Program.cs и .csproj.
Щелкните папку Pages с удержанием клавиши CTRL и выберите Добавить>New Folder (Новая папка).
Назовите папку Movies.
Щелкните папку Pages/Movies с удержанием клавиши CTRL и выберите Добавить>New Scaffolding... (Создать шаблон).
В диалоговом окне New Scaffolding (Новый шаблон) выберите Razor Pages на основе Entity Framework (CRUD)>Далее.
Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):
В строке Model class to use (Используемый класс модели) введите Movie.
В строке Класс DbContext для использования присвойте классу имя RazorPagesMovie.Data.RazorPagesMovieContext.
Выберите Готово.
Процесс формирования шаблонов может занять некоторое время, так как необходимые пакеты автоматически загружаются и добавляются в проект.
Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В следующем коде демонстрируется выбор строки подключения SQLite в среде разработки и SQL Server в рабочей среде.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
В приведенном выше коде не осуществляется вызов UseDeveloperExceptionPage в среде разработки, поскольку WebApplication вызывает UseDeveloperExceptionPage в режиме разработки.
Созданные и обновленные файлы
В процессе формирования шаблонов создаются указанные ниже файлы.
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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) используется для выполнения следующих действий:
Добавления первоначальной миграции.
Обновления базы данных с помощью первоначальной миграции.
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
В PMC введите следующую команду:
Add-Migration InitialCreate
Команда Add-Migration формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграции. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.
Появится следующее предупреждение, которое будет устранено на следующем шаге:
"Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения".
В PMC введите следующую команду:
Update-Database
Команда Update-Database выполняет метод Up в миграциях, которые не были применены. В этом случае команда запускает Up метод в Migrations/<time-stamp>_InitialCreate.cs файле, который создает базу данных.
Щелкните правой кнопкой мыши проект RazorPagesMovie.csproj и выберите "Открыть в интегрированном терминале".
Откроется окно терминала с командной строкой в каталоге проекта, который содержит файлы Program.cs и .csproj.
Выполните следующую команду CLI .NET:
dotnet ef migrations add InitialCreate
Команда migrations формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграциям. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.
Выполните следующую команду CLI .NET:
dotnet ef database update
Команда update выполняет метод Up в миграциях, которые не были применены. В этом случае update выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.
Примечание.
Для SQLite для типа столбца для поля Price задается значение TEXT. Это будет решено на более позднем этапе.
Щелкните проект RazorPagesMovie и нажмите кнопку "Открыть в терминале".
Откроется окно терминала с командной строкой в каталоге проекта, который содержит файлы Program.cs и .csproj.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Команды tool устанавливают последние средства Entity Framework Core после удаления любой предыдущей версии, если она существует.
Примечание.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Команда migrations формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграциям. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.
Команда update выполняет метод Up в миграциях, которые не были применены. В этом случае update выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.
Примечание.
Для SQLite для типа столбца для поля Price задается значение TEXT. Это будет решено на более позднем этапе.
Появится следующее предупреждение, которое будет устранено на следующем шаге:
"Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения".
Указывает сущности, которые включаются в модель данных.
Координаты 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.
Тестирование приложения
Запустите приложение и добавьте /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.
Проверьте ссылки Изменить, Сведения и Удалить.
В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.
Проверка контекста, зарегистрированного с помощью внедрения зависимостей
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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. Эти классы определяют свойства данных, которые хранятся в базе данных.
В Обозреватель решений щелкните правой кнопкой мыши проект> RazorPagesMovie Add>New Folder. Назовите папку Models.
Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.
Добавьте в класс 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. С этим атрибутом:
Пользователю не требуется вводить сведения о времени в поле даты.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.
Добавьте папку с именем Models.
Добавьте класс в папку Models с именем Movie.cs.
Добавьте в класс 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. С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
В Visual Studio Code нажмите клавиши CTRL+F5 (Windows) или «+F5(macOS), чтобы запустить приложение без отладки.
В области редактора под областью редактора выберите вкладку "ПРОБЛЕМЫ" или в меню "Вид", выберите "Проблемы", если он не находится в режиме. Убедитесь, что ошибки компиляции отсутствуют.
В окне средства решения щелкните проект RazorPagesMovie, а затем нажмите кнопку "Добавить>новую папку...". Присвойте папке Modelsимя.
Щелкните папкуModels, а затем нажмите кнопку "Добавить>новый класс...".
В диалоговом окне Новый файл выполните следующие действия.
Выберите на левой панели пункт Общие.
В центральной области выберите Пустой класс.
Назовите класс Movie и выберите Создать.
Добавьте в класс 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. С этим атрибутом:
Пользователю не требуется вводить сведения о времени в поле даты.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.
Создание модели фильма
В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В следующем коде демонстрируется выбор строки подключения SQLite в среде разработки и SQL Server в рабочей среде.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
В приведенном выше коде не осуществляется вызов UseDeveloperExceptionPage в среде разработки, поскольку WebApplication вызывает UseDeveloperExceptionPage в режиме разработки.
Добавьте пакет NuGet Microsoft.EntityFrameworkCore.Sqlite, который необходим для средства формирования шаблонов.
В окне средства решения щелкните проект RazorPagesMovie и выберите "Открыть в терминале".
Откроется окно терминала с командной строкой в каталоге проекта, который содержит файлы Program.cs и .csproj.
Щелкните папку Pages с удержанием клавиши CTRL и выберите Добавить>New Folder (Новая папка).
Назовите папку Movies.
Щелкните папку Pages/Movies с удержанием клавиши CTRL и выберите Добавить>New Scaffolding... (Создать шаблон).
В диалоговом окне New Scaffolding (Новый шаблон) выберите Razor Pages на основе Entity Framework (CRUD)>Далее.
Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):
В строке Model class to use (Используемый класс модели) введите Movie.
В строке Класс DbContext для использования присвойте классу имя RazorPagesMovie.Data.RazorPagesMovieContext.
Выберите Готово.
Процесс формирования шаблонов может занять некоторое время, так как необходимые пакеты автоматически загружаются и добавляются в проект.
Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В следующем коде демонстрируется выбор строки подключения SQLite в среде разработки и SQL Server в рабочей среде.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
В приведенном выше коде не осуществляется вызов UseDeveloperExceptionPage в среде разработки, поскольку WebApplication вызывает UseDeveloperExceptionPage в режиме разработки.
Созданные и обновленные файлы
В процессе формирования шаблонов создаются указанные ниже файлы.
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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) используется для выполнения следующих действий:
Добавления первоначальной миграции.
Обновления базы данных с помощью первоначальной миграции.
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
В PMC введите следующие команды:
Add-Migration InitialCreate
Update-Database
Команда Add-Migration формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграции. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.
Команда Update-Database выполняет метод Up в миграциях, которые не были применены. В этом случае команда запускает Up метод в Migrations/<time-stamp>_InitialCreate.cs файле, который создает базу данных.
Щелкните правой кнопкой мыши проект RazorPagesMovie.csproj и выберите "Открыть в интегрированном терминале".
Откроется окно терминала с командной строкой в каталоге проекта, который содержит файлы Program.cs и .csproj.
Выполните следующие команды интерфейса командной строки .NET:
dotnet ef migrations add InitialCreate
dotnet ef database update
Команда migrations формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграциям. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.
Команда update выполняет метод Up в миграциях, которые не были применены. В этом случае update выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.
Примечание.
Для SQLite для типа столбца для поля Price задается значение TEXT. Это будет решено на более позднем этапе.
Щелкните проект RazorPagesMovie и нажмите кнопку "Открыть в терминале".
Откроется окно терминала с командной строкой в каталоге проекта, который содержит файлы Program.cs и .csproj.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Команды tool устанавливают последние средства Entity Framework Core после удаления любой предыдущей версии, если она существует.
Примечание.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Команда migrations формирует код для создания схемы исходной базы данных. Схема создается на основе модели, указанной в DbContext. Аргумент InitialCreate используется для присвоения имен миграциям. Можно использовать любое имя, однако по соглашению выбирается имя, которое описывает миграцию.
Команда update выполняет метод Up в миграциях, которые не были применены. В этом случае update выполняет метод Up в файле Migrations/<time-stamp>_InitialCreate.cs, который создает базу данных.
Примечание.
Для SQLite для типа столбца для поля Price задается значение TEXT. Это будет решено на более позднем этапе.
Появится следующее предупреждение, которое будет устранено на следующем шаге:
"Для десятичного столбца Price в типе сущности Movie не указан тип. Это приведет к тому, что значения будут усекаться без вмешательства пользователя, если они не помещаются в значения точности и масштаба по умолчанию. С помощью метода HasColumnType() явно укажите тип столбца SQL Server, который может вместить все значения".
Указывает сущности, которые включаются в модель данных.
Координаты 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.
Тестирование приложения
Запустите приложение и добавьте /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.
Проверьте ссылки Изменить, Сведения и Удалить.
В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.
Проверка контекста, зарегистрированного с помощью внедрения зависимостей
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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. Эти классы определяют свойства данных, которые хранятся в базе данных.
В Обозреватель решений щелкните правой кнопкой мыши проект> RazorPagesMovie Add>New Folder. Назовите папку Models.
Щелкните правой кнопкой мыши папку Models. Выберите Добавить>Класс. Присвойте классу имя Movie.
Добавьте в класс 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. С этим атрибутом:
Пользователю не требуется вводить сведения о времени в поле даты.
Отображается только дата, а не время.
Добавьте папку с именем Models.
Добавьте класс в папку Models с именем Movie.cs.
Добавьте в класс 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. С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
Отображается только дата, а не время.
Добавление пакетов NuGet и средств EF
Выполните следующие команды интерфейса командной строки .NET:
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
В окне средства решения щелкните правой кнопкой мыши проект RazorPagesMovie и выберите команду Добавить>новую папку.... Присвойте папке Modelsимя.
Щелкните папку Models правой кнопкой мыши и выберите пункт Добавить>New File... (Новый файл).
В диалоговом окне Новый файл выполните следующие действия.
Выберите на левой панели пункт Общие.
В центральной области выберите Пустой класс.
Назовите класс Movie и выберите Создать.
Добавьте в класс 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. С этим атрибутом:
Пользователю не требуется вводить сведения о времени в поле даты.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.
Создание модели фильма
В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.
Добавьте пакет NuGet Microsoft.EntityFrameworkCore.Design, который необходим для средства формирования шаблонов.
В меню "Сервис" выберите NuGet диспетчер пакетов> Manage NuGet Packages for Solution
Откройте вкладку Browse (Обзор).
Введите Microsoft.EntityFrameworkCore.Design и выберите его из списка.
Установите флажок Проект и выберите Установить.
Нажмите кнопку Принимаю в диалоговом окне Принятие условий лицензионного соглашения.
Создайте папку Pages/Movies.
Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
Назовите папку Movies.
Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolded Item (Создать шаблонный элемент).
В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD)>Добавить.
Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):
В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models).
В строке Класс контекста данных щелкните знак плюса (+).
В диалоговом окне Добавление контекста данных будет сгенерировано имя класса RazorPagesMovie.Data.RazorPagesMovieContext.
Выберите Добавить.
Если появляется сообщение об ошибке, в котором говорится о необходимости установить пакет Microsoft.EntityFrameworkCore.SqlServer, повторите действия, начиная с шага Добавить>New Scaffolded Item (Создать шаблонный элемент).
Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.
Откройте в командной оболочке папку проекта, которая содержит файлы Program.cs и .csproj. Выполните следующую команду:
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В следующем коде демонстрируется выбор строки подключения SQLite в среде разработки и SQL Server в рабочей среде.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
В приведенном выше коде не осуществляется вызов UseDeveloperExceptionPage в среде разработки, поскольку WebApplication вызывает UseDeveloperExceptionPage в режиме разработки.
Создайте папку Pages/Movies:
Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
Назовите папку Movies.
Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolding... (Новый шаблон).
В диалоговом окне New Scaffolding (Новый шаблон) выберите Razor Pages на основе Entity Framework (CRUD)>Далее.
Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):
В строке Model class to use (Используемый класс модели) введите Movie.
В строке Класс DbContext для использования присвойте классу имя RazorPagesMovie.Data.RazorPagesMovieContext.
Выберите Готово.
Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В следующем коде демонстрируется выбор строки подключения SQLite в среде разработки и SQL Server в рабочей среде.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
В приведенном выше коде не осуществляется вызов UseDeveloperExceptionPage в среде разработки, поскольку WebApplication вызывает UseDeveloperExceptionPage в режиме разработки.
Созданные и обновленные файлы
В процессе формирования шаблонов создаются указанные ниже файлы.
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();
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.UseSqlite(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) используется для выполнения следующих действий:
Добавления первоначальной миграции.
Обновления базы данных с помощью первоначальной миграции.
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
В PMC введите следующие команды:
Add-Migration InitialCreate
Update-Database
В окне средства решения щелкните правой кнопкой мыши проект RazorPagesMovie и выберите "Открыть в терминале".
Откроется окно терминала с командной строкой в каталоге проекта, который содержит файлы Program.cs и .csproj.
Выполните следующие команды интерфейса командной строки .NET:
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Примечание.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Примечание.
Для SQLite для типа столбца для поля Price задается значение TEXT. Это будет решено на более позднем этапе.
Предыдущие команды устанавливают средства 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();
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.UseSqlite(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();
Указывает сущности, которые включаются в модель данных.
Координаты 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.
Тестирование приложения
Запустите приложение и добавьте /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.
Проверьте ссылки Изменить, Сведения и Удалить.
В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.
В этом разделе добавляются классы для управления фильмами в базе данных. Классы моделей приложения используют Entity Framework Core (EF Core) для работы с базой данных. EF Core — это реляционная схема объектов (O/RM), которая упрощает доступ к данным. Сначала вы записываете классы модели и EF Core создаете базу данных.
Классы модели называются классами POCO (от P lain-O ld CLR O bjects), так как они не имеют зависимостиEF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.
В Обозреватель решений щелкните правой кнопкой мыши проект> RazorPagesMovie Add>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). С этим атрибутом:
Пользователю не требуется вводить сведения о времени в поле даты.
Отображается только дата, а не время.
Добавьте папку с именем Models.
Добавьте класс в папку Models с именем Movie.cs.
Добавьте в класс 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). С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
Отображается только дата, а не время.
Добавление пакетов NuGet и средств EF
Выполните следующие команды интерфейса командной строки .NET:
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Если вы сталкиваетесь с ошибкой формирования шаблонов, убедитесь, что моникер целевой платформы (TFM) соответствует версии пакета NuGet в файле проекта. Например, следующий файл проекта использует версию 5.0 для .NET, а также приведенные ниже пакеты NuGet:
В окне средства решения щелкните проект RazorPagesMovie, а затем нажмите кнопку "Добавить>новую папку...". Присвойте папке Modelsимя.
Щелкните папку Models с удержанием клавиши CTRL и выберите пункт Добавить>New File... (Новый файл).
В диалоговом окне Новый файл выполните следующие действия.
Выберите на левой панели пункт Общие.
В центральной области выберите Пустой класс.
Назовите класс 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). С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.
Создание модели фильма
В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В примере кода ниже показано, как внедрить IWebHostEnvironment в Startup. Интерфейс IWebHostEnvironment внедрен, поэтому ConfigureServices может использовать SQLite в среде разработки и SQL Server в рабочей среде.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Создайте папку Pages/Movies:
Щелкните папку Pages с удержанием клавиши CTRL и выберите Добавить>New Folder (Новая папка).
Назовите папку Movies.
Щелкните папку Pages/Movies с удержанием клавиши CTRL и выберите Добавить>New Scaffolding... (Создать шаблон).
В диалоговом окне New Scaffolding (Новый шаблон) выберите Razor Pages на основе Entity Framework (CRUD)>Далее.
Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):
В строке Класс DbContext для использования присвойте классу имя RazorPagesMovie.Data.RazorPagesMovieContext.
Выберите Готово.
Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В примере кода ниже показано, как внедрить IWebHostEnvironment в Startup. Интерфейс IWebHostEnvironment внедрен, поэтому ConfigureServices может использовать SQLite в среде разработки и SQL Server в рабочей среде.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Созданные и обновленные файлы
В процессе формирования шаблонов создаются указанные ниже файлы.
Pages/Movies: Create, Delete, Details, Edit и Index.
Data/RazorPagesMovieContext.cs
Обновленные файлы
Startup.cs
В следующем разделе приводится описание созданных и обновленных файлов.
Создание начальной схемы базы данных с помощью функции миграции EF
Функция миграции в Entity Framework Core предоставляет следующие возможности:
Создание начальной схемы базы данных.
Поэтапное обновление схемы базы данных, чтобы она соответствовала модели данных приложения. Существующие данные в базе данных сохраняются.
В этом разделе окно Консоль диспетчера пакетов (PMC) используется для выполнения следующих действий:
Добавления первоначальной миграции.
Обновления базы данных с помощью первоначальной миграции.
В меню Сервис последовательно выберите пункты Диспетчер пакетов NuGet>Консоль диспетчера пакетов.
В PMC введите следующие команды:
Add-Migration InitialCreate
Update-Database
Выполните следующие команды интерфейса командной строки .NET:
dotnet ef migrations add InitialCreate
dotnet ef database update
Примечание.
Для SQLite для типа столбца для поля Price задается значение TEXT. Это будет решено на более позднем этапе.
Для 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.
Проверьте метод Up.
Тестирование приложения
Запустите приложение и добавьте /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.
Проверьте ссылки Изменить, Сведения и Удалить.
Ведение журнала SQL Entity Framework Core
Конфигурация ведения журналов обычно предоставляется разделом Logging в файлах appsettings.{Environment}.json. Чтобы регистрировать инструкции SQL, добавьте "Microsoft.EntityFrameworkCore.Database.Command": "Information" в файл appsettings.Development.json:
В этом разделе добавляются классы для управления фильмами. Классы моделей приложения используют Entity Framework Core (EF Core) для работы с базой данных. EF Core — это реляционная схема объектов (O/RM), которая упрощает доступ к данным.
Классы модели называются классами POCO (из "обычных объектов CLR"), так как они не имеют никакой зависимости EF Core. Эти классы определяют свойства данных, которые хранятся в базе данных.
Щелкните правой кнопкой мыши папку 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). С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
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). С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Если вы сталкиваетесь с ошибкой формирования шаблонов, убедитесь, что моникер целевой платформы (TFM) соответствует версии пакета NuGet в файле проекта. Например, следующий файл проекта содержит версию 3.1 для .NET Core, а также приведенные ниже пакеты NuGet:
В проекте RazorPagesMovie создайте новую папку с именем Data.
Добавьте следующий класс RazorPagesMovieContext в папку Data:
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 для набора сущностей. В терминологии Entity Framework набор сущностей обычно соответствует таблице базы данных, а сущность — строке в этой таблице. Код не будет компилироваться, пока на более позднем этапе не будут добавлены зависимости.
Добавление строки подключения базы данных
Добавьте строку подключения в файл appsettings.json, как это показано в следующем выделенном коде:
Добавьте следующие инструкции using в начало файла Startup.cs:
using RazorPagesMovie.Data;
using Microsoft.EntityFrameworkCore;
Зарегистрируйте контекст базы данных в контейнере внедрения зависимостей в файле Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
В окне средства решения щелкните проект RazorPagesMovie, а затем нажмите кнопку "Добавить>новую папку...". Присвойте папке Modelsимя.
Щелкните папку Models правой кнопкой мыши и выберите пункт Добавить>New File... (Новый файл).
В диалоговом окне Новый файл выполните следующие действия.
Выберите на левой панели пункт Общие.
В центральной области выберите Пустой класс.
Назовите класс 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). С этим атрибутом:
пользователю не требуется вводить сведения о времени в поле даты.
Выполните сборку проекта, чтобы убедиться в отсутствии ошибок компиляции.
Создание модели фильма
В этом разделе создается модель фильма. То есть средство формирования шаблонов создает страницы для операций создания, чтения, обновления и удаления для модели фильма.
Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
Назовите папку Movies.
Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolded Item (Создать шаблонный элемент).
В диалоговом окне Добавление шаблона щелкните Razor Pages на основе Entity Framework (CRUD)>Добавить.
Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):
В раскрывающемся списке Класс модели выберите Фильм (RazorPagesMovie.Models).
В строке класса контекста данных выберите + знак (плюс) и измените созданное имя из RazorPagesMovie.Models. RazorPagesMovieContext в RazorPagesMovie.Данные. RazorPagesMovieContext. Это изменение не требуется. Оно создает класс контекста базы данных с правильным пространством имен.
Выберите Добавить.
Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.
Откройте в командном окне папку проекта, которая содержит файлы Program.cs, Startup.cs и .csproj.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В примере кода ниже показано, как внедрить IWebHostEnvironment в среду загрузки. Интерфейс IWebHostEnvironment внедрен, поэтому ConfigureServices может использовать SQLite в среде разработки и SQL Server в рабочей среде.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Создайте папку Pages/Movies:
Щелкните правой кнопкой мыши папку Pages и выберите Добавить>New Folder (Новая папка).
Назовите папку Movies.
Щелкните правой кнопкой мыши папку Pages/Movies и выберите Добавить>New Scaffolding... (Новый шаблон).
В диалоговом окне New Scaffolding (Новый шаблон) выберите Razor Pages на основе Entity Framework (CRUD)>Далее.
Заполните поля в диалоговом окне Добавление Razor Pages на основе Entity Framework (CRUD):
В раскрывающемся списке Класс модели выберите или введите Фильм (RazorPagesMovie.Models).
В строке Data context class (Класс контекста данных) введите имя нового класса RazorPagesMovie.Data.RazorPagesMovieContext. Это изменение не требуется. Оно создает класс контекста базы данных с правильным пространством имен.
Выберите Добавить.
Файл appsettings.json обновляется с указанием строки подключения, используемой для подключения к локальной базе данных.
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Использование SQLite для среды разработки и SQL Server для рабочей среды
Если выбрана SQLite, код, созданный шаблоном, будет готов к разработке. В примере кода ниже показано, как внедрить IWebHostEnvironment в среду загрузки. Интерфейс IWebHostEnvironment внедрен, поэтому ConfigureServices может использовать SQLite в среде разработки и SQL Server в рабочей среде.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см . параметр dotnet tool install, --arch.
Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
Выполните следующие команды интерфейса командной строки .NET:
dotnet ef migrations add InitialCreate
dotnet ef database update
Приведенные выше команды создают следующее предупреждение: "Тип не указан для десятичного столбца "Цена" в типе сущности 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.
Проверьте метод Up.
Тестирование приложения
Запустите приложение и добавьте /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.
Проверьте ссылки Изменить, Сведения и Удалить.
В следующем учебнике рассматриваются файлы, созданные с помощью формирования шаблонов.
Бұл мазмұнның көзін GitHub сайтында табуға болады. Онда сонымен бірге мәселелер мен өзгертулерді енгізу сұрауларын жасауға және қарап шығуға болады. Қосымша ақпарат алу үшін қатысушы нұсқаулығын қараңыз.