Поделиться через


Создание приложения для базы данных фильмов (Часть 7 - Добавление нового поля)

Примечание.

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

Внимание

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

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

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

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

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

Внимание

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

Добавление рейтинга фильма в модель приложения

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

[Required]
[RegularExpression(@"^(G|PG|PG-13|R|NC-17)$")]
public string? Rating { get; set; }

Добавление рейтинга фильма в компоненты CRUD приложения

Create Откройте файл определения компонента (Components/Pages/MoviePages/Create.razor).

Добавьте следующий <div> блок между блоком <div> для Price и кнопкой создания (<button>):

<div class="mb-3">
    <label for="rating" class="form-label">Rating:</label> 
    <InputText id="rating" @bind-Value="Movie.Rating" class="form-control" /> 
    <ValidationMessage For="() => Movie.Rating" class="text-danger" /> 
</div>

Delete Откройте файл определения компонента (Components/Pages/MoviePages/Delete.razor).

Добавьте следующий блок списка описаний (<dl>) между блоком списка описаний для Price и компонентом EditForm.

<dl class="row">
    <dt class="col-sm-2">Rating</dt>
    <dd class="col-sm-10">@movie.Rating</dd>
</dl>

Details Откройте файл определения компонента (Components/Pages/MoviePages/Details.razor).

Добавьте следующий термин списка описания (<dt>) и элемент списка описания (<dl>) после термина и элемента для Price, сразу внутри закрывающего </dl> тега:

<dt class="col-sm-2">Rating</dt>
<dd class="col-sm-10">@movie.Rating</dd>

Edit Откройте файл определения компонента (Components/Pages/MoviePages/Edit.razor).

Добавьте следующий <div> блок между блоком <div> для Price и кнопкой сохранения (<button>):

<div class="mb-3">
    <label for="rating" class="form-label">Rating:</label>
    <InputText id="rating" @bind-Value="Movie.Rating" class="form-control" />
    <ValidationMessage For="() => Movie.Rating" class="text-danger" />
</div>

Index Откройте файл определения компонента (Components/Pages/MoviePages/Index.razor).

Обновите QuickGrid компонент, чтобы включить рейтинг фильма. Добавьте следующее PropertyColumn<TGridItem,TProp> сразу после столбца для Price:

<PropertyColumn Property="movie => movie.Rating" />

Обновите SeedData класс (Data/SeedData.cs), чтобы предоставить значение по умолчанию для нового свойства Rating для операций повторного сеяния.

Следующее изменение предназначено для блока Mad Maxnew Movie. Rating = "R", добавляется в блок:

new Movie
{
    Title = "Mad Max",
    ReleaseDate = DateOnly.Parse("1979-4-12"),
    Genre = "Sci-fi (Cyberpunk)",
    Price = 2.51M,
+   Rating = "R",
},

Rating Добавьте свойство к каждому из остальных new Movie блоков таким же образом. Ниже приведены рейтинги оставшихся фильмов Mad Max при добавлении новых Rating строк:

  • Роуд Воин: R
  • Безумный Макс: За громом: PG-13
  • Безумный Макс: Фьюри Роуд: R
  • Фуриоса: Безумный Макс Сага: R

Сохраните все обновленные файлы.

Еще не запускайте приложение. Создайте приложение, чтобы убедиться, что ошибок нет.

Выберите Сборка>Перестроить решение в строке меню.

В палитре команд используйте .NET: Build команду.

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

dotnet build

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

Обновление базы данных

Если вы попытаетесь запустить приложение на этом этапе, оно завершится с ошибкой SQL, так как база данных не включает Rating столбец в своей Movie таблице. Существует три подхода, которые можно предпринять для устранения несоответствия между схемой базы данных и схемой модели:

  • Измените схему базы данных таким образом, чтобы она соответствовала классу модели. Преимущество этого подхода заключается в том, что он поддерживает данные базы данных. Используйте этот подход с помощью инструментов базы данных или создав скрипт изменения базы данных, который не рассматривается в этом руководстве, но можно узнать с помощью других статей. Недостатком этого подхода является то, что он требует больше времени и более подвержен ошибкам из-за его повышенной сложности. В этом руководстве этот подход не применяется.
  • Используйте EF Core для автоматического удаления и воссоздания базы данных с использованием новой схемы класса модели, теряя при этом данные, хранящиеся в базе данных. База данных перезапучена свежими данными при запуске приложения. Этот подход позволяет быстро развивать модель и схему базы данных вместе. Не используйте этот подход в рабочей базе данных с данными, которые должны быть сохранены. В этом руководстве этот подход не применяется.
  • Используйте миграцию EF Core для обновления схемы базы данных после изменения модели в приложении. Этот подход эффективен и сохраняет данные базы данных. В этом руководстве используется этот подход.

Создайте миграцию для обновления схемы базы данных. Рейтинг фильма в виде Rating столбца добавляется в таблицу базы данных Movie .

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

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

Миграция:

  • Сравнивает Movie модель с схемой Movie таблицы базы данных.
  • Создает код для переноса схемы базы данных в соответствии с моделью.

Создание миграции не задает значение по умолчанию для оценки при обновлении базы данных. Однако вы можете вручную внести изменения в файл миграции, чтобы применить значение оценки фильма по умолчанию, которое может быть полезно при наличии множества записей, требующих значения по умолчанию. В этом случае все, кроме одного из фильмов Mad Max, оценены как R, поэтому значение R по умолчанию для столбца Rating является подходящим. Один фильм, который не имеет оценки R , может быть обновлен позже в работающем приложении.

Просмотрите файлы в папке проекта в Обозревателе решений Visual Studio. Откройте файл миграции, добавляющий поле оценки фильма, которое имеет имя {TIME STAMP}_AddRatingField.csфайла, где {TIME STAMP} заполнитель — метка времени (например, 20240530123755_AddRatingField.cs).

Найдите блок AddColumn, добавляющий столбец оценки Movie в таблицу в базе данных. Измените последнюю строку, которая применяет значение по умолчанию (defaultValue). Измените его с пустой строки ("") на рейтинг фильма R ("R"):

migrationBuilder.AddColumn<string>(
    name: "Rating",
    table: "Movie",
    type: "nvarchar(max)",
    nullable: false,
-   defaultValue: "");
+   defaultValue: "R");

Сохраните файл миграции.

В области зависимостей служб SQL Server Express LocalDB выберите многоточие () и ...".

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

Измените тот единственный фильм, который не имеет рейтинг Р.

  1. Запустите приложение.
  2. Редактируйте фильм Безумный Макс: Под куполом грома.
  3. Обновите рейтинг фильма от R до PG-13. Сохраните изменения.

Примечание.

Альтернативой изменению файла миграции является удаление записей в базе данных и повторное запуск приложения для повторного изменения базы данных. Код заполнения был изменён ранее, чтобы поддерживать значения по умолчанию. Этот подход полезен в случаях, когда назначение полям значений по умолчанию лучше контролировать или быстрее реализовать с помощью кода C# во время заполнения. Дополнительные сведения см. в разделе "Удаление всех записей базы данных и повторное заполнение базы данных" в конце этой статьи.

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

dotnet ef migrations add AddRatingField

Команда dotnet-ef migrations делает следующее:

  • Сравнивает Movie модель с схемой Movie таблицы базы данных.
  • Создает код для переноса схемы базы данных в соответствии с моделью.

При обновлении базы данных создание миграции не подготавливает значение по умолчанию для оценки. Однако можно вручную внести небольшое изменение в файл миграции, чтобы применить значение оценки фильма по умолчанию, которое может быть полезно при наличии множества записей, требующих значения по умолчанию. В этом случае все фильмы серии Mad Max, кроме одного, имеют рейтинг R, поэтому значение по умолчанию "R" для столбца Rating подходит. Один фильм, который не имеет оценки R , может быть обновлен позже в работающем приложении.

Проверьте файлы в Migrations папке проекта. Откройте файл миграции, добавляющий поле оценки фильма, которое имеет имя {TIME STAMP}_AddRatingField.csфайла, где {TIME STAMP} заполнитель — метка времени (например, 20240530123755_AddRatingField.cs).

Найдите блок AddColumn, который добавляет столбец оценок Movie в таблицу в базе данных. Измените последнюю строку, которая применяет значение по умолчанию (defaultValue). Измените его с пустой строки ("") на рейтинг фильма R ("R"):

migrationBuilder.AddColumn<string>(
    name: "Rating",
    table: "Movie",
    type: "nvarchar(max)",
    nullable: false,
-   defaultValue: "");
+   defaultValue: "R");

Сохраните файл миграции.

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

dotnet ef database update

Измените тот самый фильм, не имеющий рейтинга R:

  1. Запустите приложение.
  2. Редактировать Безумный Макс: Под куполом грома.
  3. Обновите рейтинг фильма от R до PG-13. Сохраните изменения.

Примечание.

Альтернативой изменению файла миграции является удаление записей в базе данных и повторное запуск приложения для повторного изменения базы данных. Код начальной настройки был ранее изменён, чтобы указать значения по умолчанию. Этот подход полезен в случаях, когда назначение полям значений по умолчанию лучше осуществляется или быстрее выполняется с помощью кода C# во время заполнения. Для получения дополнительной информации см. раздел "Удалите все записи базы данных и повторно заполните базу данных" в конце этой статьи.

В командной оболочке, открывшейся в корневой папке проекта, выполните следующую команду, чтобы добавить миграцию. Имя миграции (AddRatingField) — это произвольное описание миграции:

dotnet ef migrations add AddRatingField

Команда dotnet-ef migrations делает следующее:

  • Сравнивает Movie модель с схемой Movie таблицы базы данных.
  • Создает код для переноса схемы базы данных в соответствии с моделью.

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

Проверьте файлы в Migrations папке проекта. Откройте файл миграции, добавляющий поле оценки фильма, которое имеет имя {TIME STAMP}_AddRatingField.csфайла, где {TIME STAMP} заполнитель — метка времени (например, 20240530123755_AddRatingField.cs).

Найдите блок AddColumn, который добавляет столбец рейтинга Movie в таблицу базы данных. Измените последнюю строку, которая применяет значение по умолчанию (defaultValue). Измените его с пустой строки ("") на рейтинг фильма R ("R"):

migrationBuilder.AddColumn<string>(
    name: "Rating",
    table: "Movie",
    type: "nvarchar(max)",
    nullable: false,
-   defaultValue: "");
+   defaultValue: "R");

Сохраните файл миграции.

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

dotnet ef database update

Измените один фильм, не оцененный на R:

  1. Запустить приложение.
  2. Редактируйте фильм Безумный Макс: Под куполом грома.
  3. Обновите рейтинг фильма от R до PG-13. Сохраните изменения.

Примечание.

Альтернативой изменению файла миграции является удаление записей в базе данных и повторное запуск приложения для повторного изменения базы данных. Код заполнения был изменен ранее, чтобы указать значения по умолчанию. Этот подход полезен в случаях, когда назначение значений по умолчанию для полей лучше контролировать или выполнять быстрее с помощью кода C# во время заполнения. Дополнительные сведения см. в разделе "Удаление всех записей базы данных и повторное заполнение базы данных" в конце этой статьи.

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

Устранение неполадок

В случае повреждения базы данных удалите базу данных и используйте миграции для повторного создания базы данных:

  1. Выберите базу данных в Обозреватель объектов SQL Server (SSOX).
  2. Щелкните базу данных правой кнопкой мыши и выберите Удалить. Убедитесь, что в списке выбрана правильная база данных.
  3. Выберите Закрыть существующие соединения.
  4. Нажмите ОК.
  5. В Обозревателе решений дважды щелкните Подключенные службы. В области зависимостей службы выберите многоточие (...), а затем Обновление базы данных в области SQL Server Express LocalDB. Обновление базы данных запускает уже существующие миграции, которые восстанавливают базу данных.
  1. Удалите базу данных. Если средство базы данных имеет подключение к базе данных, закройте средство сначала или используйте функции средства для закрытия подключения к базе данных и удаления базы данных. Дополнительные сведения см. в документации по инструменту. Убедитесь, что в списке выбрана правильная база данных.

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

    dotnet ef database update
    
  1. Удалите базу данных. Если средство базы данных имеет подключение к базе данных, закройте средство сначала или используйте функции средства для закрытия подключения к базе данных и удаления базы данных. Дополнительные сведения см. в документации по инструменту. Убедитесь, что в списке выбрана правильная база данных.

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

    dotnet ef database update
    

Удаление всех записей базы данных и повторное изменение базы данных

В этом разделе описывается альтернативный процесс обновления базы данных со значением по умолчанию для нового свойства модели без изменения файла миграции. Если вы выполнили все действия, описанные в разделе "Обновление базы данных " ранее в этой статье, не требуется.

Чтобы удалить все записи в базе данных, используйте один из следующих подходов:

  • Запустите приложение и используйте ссылки на удаление в браузере. Этот подход достаточно быстр, если нужно удалить только несколько записей.
  • В Visual Studio из Обозреватель объектов SQL Server (SSOX) удалите записи базы данных. При отображении таблицы базы данных щелкните таблицу правой кнопкой мыши и выберите команду "Просмотреть данные". Когда откроется таблица для отображения записей фильма, выберите первую запись. Удерживайте клавишу SHIFT и выберите последнюю запись, чтобы выбрать все записи в таблице. При выборе всех записей нажмите клавишу DELETE , чтобы удалить записи. Этот подход достаточно быстро, если требуется удалить много записей.
  • В Visual Studio из SSOX щелкните базу данных правой кнопкой мыши и выберите команду "Создать запрос". Откроется пустой файл SQL (.sql). Вставьте следующую команду в файл: DELETE FROM dbo.Movie; Выберите зеленый треугольник "Выполнить", чтобы выполнить запрос или нажать клавиши CTRL++E на клавиатуре. На вкладке "Сообщение " SSOX сообщает количество затронутых строк, удаленных в этом случае запросом. При желании можно сохранить запрос для последующего использования. В противном случае закройте файл, не сохраняя его. Этот подход особенно полезен, если таблица большая и содержит сотни тысяч записей.
  • Запустите приложение и используйте ссылки на удаление в браузере. Этот подход достаточно быстрый, если есть только несколько записей для удаления.
  • С помощью инструментов базы данных† удалите записи базы данных. В большинстве средств базы данных, позволяющих напрямую управлять данными, откройте представление данных таблицы базы данных в инструменте. Когда откроется таблица для отображения записей фильма, выберите первую запись. Удерживайте клавишу SHIFT и выберите последнюю запись, чтобы выбрать все записи в базе данных. При выборе всех записей нажмите клавишу DELETE , чтобы удалить записи. Эти инструкции могут потребоваться изменить в зависимости от используемого средства базы данных. Дополнительные сведения см. в документации по инструменту. Этот подход достаточно быстро, если требуется удалить много записей.
  • С помощью средств базы данных† выполните SQL-запрос к таблице фильмов для удаления записей таблицы. Команда SQL — это DELETE FROM dbo.Movie;. При желании можно сохранить запрос для последующего использования. В противном случае закройте файл, не сохраняя его. Изучите документацию инструмента, чтобы узнать точные шаги. Этот подход особенно полезен, если таблица большая и содержит сотни тысяч записей.

Инструменты для работы с базами данных: существует множество бесплатных и платных инструментов для работы с базами данных, доступных на открытом рынке, которые могут работать с SQL-базами данных. Ознакомьтесь с интернет-ресурсами, чтобы найти подходящий для вашей базы данных и платформы.

  • Запустите приложение и используйте ссылки на удаление в браузере. Этот подход достаточно быстрый, когда нужно удалить всего несколько записей.
  • С помощью инструментов базы данных† удалите записи базы данных. В большинстве средств базы данных, позволяющих напрямую управлять данными, откройте представление данных таблицы базы данных в инструменте. Когда откроется таблица для отображения записей фильма, выберите первую запись. Удерживайте клавишу SHIFT и выберите последнюю запись, чтобы выбрать все записи в базе данных. При выборе всех записей нажмите клавишу DELETE , чтобы удалить записи. Эти инструкции могут потребоваться изменить в зависимости от используемого средства базы данных. Дополнительные сведения см. в документации по инструменту. Этот подход достаточно быстро, если требуется удалить много записей.
  • С помощью средств базы данных† выполните SQL-запрос к таблице фильмов для удаления записей таблицы. Команда SQL — DELETE FROM dbo.Movie;это . При желании можно сохранить запрос для последующего использования. В противном случае закройте файл, не сохраняя его. Обратитесь к документации инструмента для получения точных шагов. Этот подход особенно полезен, если таблица большая и содержит сотни тысяч записей.

инструменты базы данных: существует множество бесплатных и коммерческих инструментов базы данных, доступных на открытом рынке для работы с SQL-базами данных. Ознакомьтесь с интернет-ресурсами, чтобы найти подходящий для вашей базы данных и платформы.

Предупреждение

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

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

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

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

Репозиторий GitHub с примерами для Blazor (dotnet/blazor-samples)

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

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

Mad Max, The Road Warrior, Mad Max: Beyond Thunderdome, Mad Max: Fury Road, и Furiosa: Mad Max Saga являются товарными знаками и авторскими правами Warner Bros. Развлечения.

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