Создание приложения для базы данных фильмов Blazor (часть 5 - добавление проверки)

Примечание.

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

Эта статья является пятой частью руководства по приложению базы данных фильма Blazor, которая учит вас основам создания ASP.NET Core Blazor Web App с функциями управления базой данных фильмов.

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

Проверка с помощью заметок данных

Правила проверки задаются в классе модели с помощью заметок данных. В следующем списке показаны некоторые атрибуты System.ComponentModel.DataAnnotations для проверки пользовательского ввода в свойствах public модели формы.

  • [Required]: требуется, чтобы пользователь предоставил значение.
  • [StringLength]: указывает минимальную и максимальную длину символов. Обратите внимание, что если передать MinimumLength атрибуту, это не сделает строку обязательной (необходимо применить атрибут[Required]).
  • [RegularExpression]: укажите шаблон, соответствующий входным данным пользователя.
  • [Range]: укажите минимальные и максимальные значения.

Типы значений, такие как decimal, int, float, DateOnlyTimeOnlyиDateTime, по сути, являются обязательными. Применение атрибута[Required] к типам значений не требуется.

Дополнительные аннотации данных, которые можно использовать в формах, охватываются справочной документацией Blazor.

Добавьте проверку в модель Movie

Добавьте следующие аннотации данных для свойств класса Movie. Чтобы обновить все свойства одновременно, можно скопировать и вставить весь Models/Movie.cs файл, который отображается после следующего примера кода.

+ [Required]
+ [StringLength(60, MinimumLength = 3)]
  public string? Title { get; set; }

+ [Required]
+ [StringLength(30)]
+ [RegularExpression(@"^[A-Z]+[a-zA-Z()\s-]*$")]
  public string? Genre { get; set; }

+ [Range(0, 100)]
  [DataType(DataType.Currency)]
  [Column(TypeName = "decimal(18, 2)")]
  public decimal Price { get; set; }

Models/Movie.cs файл после применения предыдущих аннотаций данных к свойствам:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace BlazorWebAppMovies.Models;

public class Movie
{
    public int Id { get; set; }

    [Required]
    [StringLength(60, MinimumLength = 3)]
    public string? Title { get; set; }

    public DateOnly ReleaseDate { get; set; }

    [Required]
    [StringLength(30)]
    [RegularExpression(@"^[A-Z]+[a-zA-Z()\s-]*$")]
    public string? Genre { get; set; }

    [Range(0, 100)]
    [DataType(DataType.Currency)]
    [Column(TypeName = "decimal(18, 2)")]
    public decimal Price { get; set; }
}

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

EF Core Создание миграции и обновление базы данных

Схема модели данных определяет, как данные упорядочены и подключены в реляционной базе данных.

Добавление заметок данных в Movie класс в предыдущем разделе не приводит к автоматическим изменениям схемы базы данных.

Просмотрите аннотации, примененные к свойству Title.

[Required]
[StringLength(60, MinimumLength = 3)]
public string? Title { get; set; }

Разница между свойством модели и схемой базы данных приведена в следующей таблице. Ни одно ограничение не совпадает после применения аннотации данных к модели Movie.

Ограничение Свойство model Title Столбец базы данных Title
Максимальная длина 60 символов Пары байтов до 2 ГБ†
NVARCHAR (MAX)
Обязательное поле Да
[Required]
Нет
NULL разрешено в столбце.

†Символьные колонки базы данных определяются размером (парами байтов). Одна пара байтов для каждого символа используется для символов, определенных в диапазоне Юникода от 0 до 65 535. Однако отдельные символы за пределами этого диапазона Юникода принимают несколько байтовых пар для хранения, поэтому фактическое количество символов, которые может хранить столбец, является произвольным. Важная концепция для сравнения Title свойства Movie модели и схемы базы данных для Title столбца заключается в том, что около 2 ГБ хранимых байт-пар в базе данных гораздо превышает 60 символьных ограничений для свойства. Схема базы данных должна быть изменена вниз , чтобы она соответствовала ограничению приложения.

Чтобы сопоставить Movie длину значения свойства модели Title в приложении, база данных должна задать NVARCHAR (60) размер столбца Title. Разница в схеме не приводит EF Core к возникновению исключения при использовании приложения, так как заголовок фильма длиной 60 символов, публикуемый пользователем, вписывается в пределы ограничения базы данных на размер заголовка, составляющего приблизительно 2 ГБ. Однако рассмотрим обратную ситуацию, когда свойству модели присваивается ограничение, превышающее то, что позволяет база данных, и пользователь публикует слишком длинную строку для столбца символов базы данных: исключение генерируется базой данных или данные обрезаются, когда пользователь отправляет значение. Модели приложения всегда должны соответствовать схеме базы данных, так как неправильная схема может привести к исключениям и хранилищу неправильных данных.

Несмотря на то, что свойство является ссылочным типом, допускающим null (nullable reference type, NRT), как обозначено на типе ?string (string?), база данных не должна хранить значение NULL в своем столбце Title из-за ограничения модели Required. При обновлении схемы базы данных на следующем шаге столбец базы данных Title должен отражать NOT NULL для столбца Title, чтобы соответствовать свойству. Важно отметить, что только потому, что свойство модели является NRT и может содержать null значение в коде не означает, что схема столбца базы данных должна иметь значение NULL (NULL разрешено). Это независимые условия, используемые для различных целей: NRT используются для предотвращения ошибок кодирования с типами, допускающими значение NULL, в то время как схема базы данных отражает точный тип и размер хранимых данных.

Чтобы согласовать модель и схему базы данных, создайте и примените EF Coreмиграцию базы данных с именем, идентифицирующим изменения миграции. Имя миграции аналогично сообщению фиксации в системе управления версиями. В следующих примерах команд имя миграции "NewMovieDataAnnotations" отражает добавление новых аннотаций данных в модель Movie.

Внимание

Убедитесь, что приложение не запущено для следующих действий.

Для остановки приложения при использовании Visual Studio требуется закрыть окно браузера.

При использовании VS Code закройте окно браузера и остановите приложение в VS Code с помощью Выполнить>Остановить отладку или нажав клавиши Shift+F5 на клавиатуре.

При использовании интерфейса командной строки .NET закройте окно браузера и остановите приложение в командной оболочке с Ctrl+C.

В Visual Studio Обозреватель решений дважды щелкните Connected Services. В области зависимостей служб выберите многоточие (...), а затем выберите Добавить миграцию в области SQL Server Express LocalDB.

Присвойте миграции названиеNewMovieDataAnnotations для её описания. Дождитесь загрузки контекста базы данных в поле имен классов DbContext. Нажмите кнопку "Готово ", чтобы создать миграцию. Нажмите кнопку "Закрыть", когда операция завершится.

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется диалоговое окно для обновления базы данных с последней миграцией. Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Нажмите кнопку Готово. Нажмите кнопку "Закрыть", когда операция завершится.

Используйте следующую команду в Терминале (меню Терминал>Новый терминал), чтобы добавить миграцию для новых аннотаций данных.

dotnet ef migrations add NewMovieDataAnnotations

Чтобы применить миграцию к базе данных, выполните следующую команду:

dotnet ef database update

Чтобы добавить миграцию для новых заметок данных, выполните следующую команду в командной оболочке, открытой в корневой папке проекта:

dotnet ef migrations add NewMovieDataAnnotations

Чтобы применить миграцию к базе данных, выполните следующую команду:

dotnet ef database update

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

Ограничение Свойство model Title Столбец базы данных Title
Максимальная длина 60 символов Разрешены 60 пар байтов†.
NVARCHAR (60)
Обязательное поле Да
[Required]
Да
NOT NULL указан для столбца.

†Шестьдесят (60) пар байтов составляет 60 символов, если для хранения названия фильма используется по одной паре байтов на символ. Это верно при использовании символов, определенных в диапазоне Юникода от 0 до 65 535.

Устранение неполадок с помощью готового примера

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

Blazor примеры GitHub репозитория (dotnet/blazor-samples)

Выберите последнюю папку версии. Пример папки для проекта этого руководства называется BlazorWebAppMovies.

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

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