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


Часть 7. Добавление нового поля на страницу Razor в ASP.NET Core

Примечание.

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

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

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

Внимание

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

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

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

В этом разделе Entity Framework Core (EF Core) используется для определения схемы базы данных на основе класса модели приложения:

  • Добавление нового поля в модель.
  • Перенос изменений в схеме нового поля в базу данных.

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

Использование EF Code для автоматического создания и отслеживания базы данных:

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

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

Добавление свойства Rating в модель Movie

  1. Models/Movie.cs Откройте файл и добавьте Rating свойство:

    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Отредактируйте Pages/Movies/Index.cshtml и добавьте поле Rating:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Обновите следующие страницы, добавив поле Rating:

Для работы приложения необходимо обновить базу данных, включив в нее новое поле. При запуске приложения без обновления базы данных возникает SqlException:

SqlException: Invalid column name 'Rating'.

Исключение SqlException связано с тем, что обновленный класс модели Movie отличается от схемы таблицы Movie в базе данных. В таблице базы данных нет столбца Rating.

Устранить эту ошибку можно несколькими способами:

  1. Можно с помощью Entity Framework автоматически удалить и повторно создать базу данных на основе новой схемы класса модели. Этот подход удобен на ранних стадиях цикла разработки. В этом случае развитие модели и схемы базы данных осуществляется одновременно. Недостатком такого подхода является потеря существующих данных в базе. В рабочей базе данных применять этот подход не следует! При разработке приложения часто выполняется удаление базы данных при изменении схемы, для чего используется инициализатор для автоматического заполнения базы тестовыми данными.
  2. Можно явно изменить схему существующей базы данных в соответствии с новыми классами модели. Преимущество подхода в том, что он сохраняет данные. Внесите это изменение вручную либо путем создания скрипта изменения для базы данных.
  3. Используйте EF Core миграции для обновления схемы базы данных.

В этом руководстве используйте EF Core миграции.

Обновите класс SeedData так, чтобы он предоставлял значение нового столбца. Ниже приведен пример изменения, которое необходимо реализовать для каждого блока new Movie.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

См. готовый файл SeedData.cs.

Создание приложения

Нажмите клавиши CTRL+SHIFT B+

Добавление миграции для поля Rating

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

  2. В консоли диспетчер пакетов (PMC) введите следующую команду:

    Add-Migration Rating
    

Команда Add-Migration задает следующие инструкции для платформы:

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

В качестве имени файла переноса используется произвольное имя "Rating". Рекомендуется присваивать этому файлу понятное имя.

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

    Update-Database
    

Команда Update-Database указывает платформе, что к базе данных нужно применить изменения схемы, а также сохранить существующие данные.

Если удалить все записи из базы данных, при инициализации она будет заполнена начальными значениями и в нее будет включено поле Rating. Это можно сделать с помощью ссылок удаления в браузере или из обозревателя объектов SQL Server (SSOX).

Другой вариант — удалить базу данных и использовать миграции для повторного создания базы данных. Удаление базы данных в SSOX:

  1. Выберите базу данных в SSOX.

  2. Щелкните базу данных правой кнопкой мыши и выберите Удалить.

  3. Выберите Закрыть существующие соединения.

  4. Нажмите ОК.

  5. Обновите базу данных в PMC.

    Update-Database
    

Запустите приложение и проверьте возможность создания, редактирования и отображения фильмов с использованием поля Rating. Если база данных не заполнена начальными значениями, задайте точку останова в методе SeedData.Initialize.

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

В этом разделе Entity Framework Code First Migrations используется для выполнения следующих задач:

  • Добавление нового поля в модель.
  • Перенос изменений в схеме нового поля в базу данных.

Если вы используете EF Code First для автоматического создания и отслеживания базы данных, Code First:

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

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

Добавление свойства Rating в модель Movie

  1. Models/Movie.cs Откройте файл и добавьте Rating свойство:

    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Отредактируйте Pages/Movies/Index.cshtml и добавьте поле Rating:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Обновите следующие страницы, добавив поле Rating:

Для работы приложения необходимо обновить базу данных, включив в нее новое поле. При запуске приложения без обновления базы данных возникает SqlException:

SqlException: Invalid column name 'Rating'.

Исключение SqlException связано с тем, что обновленный класс модели Movie отличается от схемы таблицы Movie в базе данных. В таблице базы данных нет столбца Rating.

Устранить эту ошибку можно несколькими способами:

  1. Можно с помощью Entity Framework автоматически удалить и повторно создать базу данных на основе новой схемы класса модели. Этот подход удобен на ранних стадиях цикла разработки. В этом случае развитие модели и схемы базы данных осуществляется одновременно. Недостатком такого подхода является потеря существующих данных в базе. В рабочей базе данных применять этот подход не следует! При разработке приложения часто выполняется удаление базы данных при изменении схемы, для чего используется инициализатор для автоматического заполнения базы тестовыми данными.
  2. Можно явно изменить схему существующей базы данных в соответствии с новыми классами модели. Преимущество подхода в том, что он сохраняет данные. Внесите это изменение вручную либо путем создания скрипта изменения для базы данных.
  3. Можно обновить схему базы данных с помощью Code First Migrations.

В этом руководстве используется Code First Migrations.

Обновите класс SeedData так, чтобы он предоставлял значение нового столбца. Ниже приведен пример изменения, которое необходимо реализовать для каждого блока new Movie.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

См. готовый файл SeedData.cs.

Создание приложения

Нажмите клавиши CTRL+SHIFT B+

Добавление миграции для поля Rating

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

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

    Add-Migration Rating
    Update-Database
    

Команда Add-Migration задает следующие инструкции для платформы:

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

В качестве имени файла переноса используется произвольное имя "Rating". Рекомендуется присваивать этому файлу понятное имя.

Команда Update-Database указывает платформе, что к базе данных нужно применить изменения схемы, а также сохранить существующие данные.

Если удалить все записи из базы данных, при инициализации она будет заполнена начальными значениями и в нее будет включено поле Rating. Это можно сделать с помощью ссылок удаления в браузере или из обозревателя объектов SQL Server (SSOX).

Другой вариант — удалить базу данных и использовать миграции для повторного создания базы данных. Удаление базы данных в SSOX:

  1. Выберите базу данных в SSOX.

  2. Щелкните базу данных правой кнопкой мыши и выберите Удалить.

  3. Выберите Закрыть существующие соединения.

  4. Нажмите ОК.

  5. Обновите базу данных в PMC.

    Update-Database
    

Запустите приложение и проверьте возможность создания, редактирования и отображения фильмов с использованием поля Rating. Если база данных не заполнена начальными значениями, задайте точку останова в методе SeedData.Initialize.

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

В этом разделе Entity Framework Code First Migrations используется для выполнения следующих задач:

  • Добавление нового поля в модель.
  • Перенос изменений в схеме нового поля в базу данных.

Если вы используете EF Code First для автоматического создания и отслеживания базы данных, Code First:

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

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

Добавление свойства Rating в модель Movie

  1. Models/Movie.cs Откройте файл и добавьте Rating свойство:

    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Отредактируйте Pages/Movies/Index.cshtml и добавьте поле Rating:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.Id">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.Id">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.Id">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Обновите следующие страницы, добавив поле Rating:

Для работы приложения необходимо обновить базу данных, включив в нее новое поле. При запуске приложения без обновления базы данных возникает SqlException:

SqlException: Invalid column name 'Rating'.

Исключение SqlException связано с тем, что обновленный класс модели Movie отличается от схемы таблицы Movie в базе данных. В таблице базы данных нет столбца Rating.

Устранить эту ошибку можно несколькими способами:

  1. Можно с помощью Entity Framework автоматически удалить и повторно создать базу данных на основе новой схемы класса модели. Этот подход удобен на ранних стадиях цикла разработки. В этом случае развитие модели и схемы базы данных осуществляется одновременно. Недостатком такого подхода является потеря существующих данных в базе. В рабочей базе данных применять этот подход не следует! При разработке приложения часто выполняется удаление базы данных при изменении схемы, для чего используется инициализатор для автоматического заполнения базы тестовыми данными.
  2. Можно явно изменить схему существующей базы данных в соответствии с новыми классами модели. Преимущество подхода в том, что он сохраняет данные. Внесите это изменение вручную либо путем создания скрипта изменения для базы данных.
  3. Можно обновить схему базы данных с помощью Code First Migrations.

В этом руководстве используется Code First Migrations.

Обновите класс SeedData так, чтобы он предоставлял значение нового столбца. Ниже приведен пример изменения, которое необходимо реализовать для каждого блока new Movie.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

См. готовый файл SeedData.cs.

Создание приложения

Нажмите клавиши CTRL+SHIFT B+

Добавление миграции для поля Rating

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

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

    Add-Migration Rating
    Update-Database
    

Команда Add-Migration задает следующие инструкции для платформы:

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

В качестве имени файла переноса используется произвольное имя "Rating". Рекомендуется присваивать этому файлу понятное имя.

Команда Update-Database указывает платформе, что к базе данных нужно применить изменения схемы, а также сохранить существующие данные.

Если удалить все записи из базы данных, при инициализации она будет заполнена начальными значениями и в нее будет включено поле Rating. Это можно сделать с помощью ссылок удаления в браузере или из обозревателя объектов SQL Server (SSOX).

Другой вариант — удалить базу данных и использовать миграции для повторного создания базы данных. Удаление базы данных в SSOX:

  1. Выберите базу данных в SSOX.

  2. Щелкните базу данных правой кнопкой мыши и выберите Удалить.

  3. Выберите Закрыть существующие соединения.

  4. Нажмите ОК.

  5. Обновите базу данных в PMC.

    Update-Database
    

Запустите приложение и проверьте возможность создания, редактирования и отображения фильмов с использованием поля Rating. Если база данных не заполнена начальными значениями, задайте точку останова в методе SeedData.Initialize.

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

В этом разделе Entity Framework Code First Migrations используется для выполнения следующих задач:

  • Добавление нового поля в модель.
  • Перенос изменений в схеме нового поля в базу данных.

Если вы используете EF Code First для автоматического создания и отслеживания базы данных, Code First:

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

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

Добавление свойства Rating в модель Movie

  1. Models/Movie.cs Откройте файл и добавьте Rating свойство:

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; } = string.Empty;
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; } = string.Empty;
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; } = string.Empty;
    }
    
  2. Отредактируйте Pages/Movies/Index.cshtml и добавьте поле Rating:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Обновите следующие страницы, добавив поле Rating:

Для работы приложения необходимо обновить базу данных, включив в нее новое поле. При запуске приложения без обновления базы данных возникает SqlException:

SqlException: Invalid column name 'Rating'.

Исключение SqlException связано с тем, что обновленный класс модели Movie отличается от схемы таблицы Movie в базе данных. В таблице базы данных нет столбца Rating.

Устранить эту ошибку можно несколькими способами:

  1. Можно с помощью Entity Framework автоматически удалить и повторно создать базу данных на основе новой схемы класса модели. Этот подход удобен на ранних стадиях цикла разработки. В этом случае развитие модели и схемы базы данных осуществляется одновременно. Недостатком такого подхода является потеря существующих данных в базе. В рабочей базе данных применять этот подход не следует! При разработке приложения часто выполняется удаление базы данных при изменении схемы, для чего используется инициализатор для автоматического заполнения базы тестовыми данными.
  2. Можно явно изменить схему существующей базы данных в соответствии с новыми классами модели. Преимущество подхода в том, что он сохраняет данные. Внесите это изменение вручную либо путем создания скрипта изменения для базы данных.
  3. Можно обновить схему базы данных с помощью Code First Migrations.

В этом руководстве используется Code First Migrations.

Обновите класс SeedData так, чтобы он предоставлял значение нового столбца. Ниже приведен пример изменения, которое необходимо реализовать для каждого блока new Movie.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

См. готовый файл SeedData.cs.

Постройте решение.

Добавление миграции для поля Rating

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

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

    Add-Migration Rating
    Update-Database
    

Команда Add-Migration задает следующие инструкции для платформы:

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

В качестве имени файла переноса используется произвольное имя "Rating". Рекомендуется присваивать этому файлу понятное имя.

Команда Update-Database указывает платформе, что к базе данных нужно применить изменения схемы, а также сохранить существующие данные.

Если удалить все записи из базы данных, при инициализации она будет заполнена начальными значениями и в нее будет включено поле Rating. Это можно сделать с помощью ссылок удаления в браузере или из обозревателя объектов SQL Server (SSOX).

Другой вариант — удалить базу данных и использовать миграции для повторного создания базы данных. Удаление базы данных в SSOX:

  1. Выберите базу данных в SSOX.

  2. Щелкните базу данных правой кнопкой мыши и выберите Удалить.

  3. Выберите Закрыть существующие соединения.

  4. Нажмите ОК.

  5. Обновите базу данных в PMC.

    Update-Database
    

Запустите приложение и проверьте возможность создания, редактирования и отображения фильмов с использованием поля Rating. Если база данных не заполнена начальными значениями, задайте точку останова в методе SeedData.Initialize.

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

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

В этом разделе Entity Framework Code First Migrations используется для выполнения следующих задач:

  • Добавление нового поля в модель.
  • Перенос изменений в схеме нового поля в базу данных.

Если вы используете EF Code First для автоматического создания базы данных, Code First:

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

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

Добавление свойства Rating в модель Movie

  1. Models/Movie.cs Откройте файл и добавьте Rating свойство:

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; }
    }
    
  2. сборка приложения.

  3. Отредактируйте Pages/Movies/Index.cshtml и добавьте поле Rating:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  4. Обновите следующие страницы, добавив поле Rating:

Для работы приложения необходимо обновить базу данных, включив в нее новое поле. При запуске приложения без обновления базы данных возникает SqlException:

SqlException: Invalid column name 'Rating'.

Исключение SqlException связано с тем, что обновленный класс модели Movie отличается от схемы таблицы Movie в базе данных. В таблице базы данных нет столбца Rating.

Устранить эту ошибку можно несколькими способами:

  1. Можно с помощью Entity Framework автоматически удалить и повторно создать базу данных на основе новой схемы класса модели. Этот подход удобен на ранних стадиях цикла разработки. В этом случае развитие модели и схемы базы данных осуществляется одновременно. Недостатком такого подхода является потеря существующих данных в базе. В рабочей базе данных применять этот подход не следует! При разработке приложения часто выполняется удаление базы данных при изменении схемы, для чего используется инициализатор для автоматического заполнения базы тестовыми данными.

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

  3. Можно обновить схему базы данных с помощью Code First Migrations.

В этом руководстве используется Code First Migrations.

Обновите класс SeedData так, чтобы он предоставлял значение нового столбца. Ниже приведен пример изменения, которое необходимо реализовать для каждого блока new Movie.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

См. готовый файл SeedData.cs.

Постройте решение.

Добавление миграции для поля Rating

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

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

    Add-Migration Rating
    Update-Database
    

Команда Add-Migration задает следующие инструкции для платформы:

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

В качестве имени файла переноса используется произвольное имя "Rating". Рекомендуется присваивать этому файлу понятное имя.

Команда Update-Database указывает платформе, что к базе данных нужно применить изменения схемы, а также сохранить существующие данные.

Если удалить все записи из базы данных, при инициализации она будет заполнена начальными значениями и в нее будет включено поле Rating. Это можно сделать с помощью ссылок удаления в браузере или из обозревателя объектов SQL Server (SSOX).

Другой вариант — удалить базу данных и использовать миграции для повторного создания базы данных. Удаление базы данных в SSOX:

  1. Выберите базу данных в SSOX.

  2. Щелкните базу данных правой кнопкой мыши и выберите Удалить.

  3. Выберите Закрыть существующие соединения.

  4. Нажмите ОК.

  5. Обновите базу данных в PMC.

    Update-Database
    

Запустите приложение и проверьте возможность создания, редактирования и отображения фильмов с использованием поля Rating. Если база данных не заполнена начальными значениями, задайте точку останова в методе SeedData.Initialize.

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

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

В этом разделе Entity Framework Code First Migrations используется для выполнения следующих задач:

  • Добавление нового поля в модель.
  • Перенос изменений в схеме нового поля в базу данных.

Если вы используете EF Code First для автоматического создания базы данных, Code First:

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

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

Добавление свойства Rating в модель Movie

  1. Models/Movie.cs Откройте файл и добавьте Rating свойство:

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; }
    }
    
  2. сборка приложения.

  3. Отредактируйте Pages/Movies/Index.cshtml и добавьте поле Rating:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReleaseDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Genre)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Rating)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  4. Обновите следующие страницы, добавив поле Rating:

Для работы приложения необходимо обновить базу данных, включив в нее новое поле. При запуске приложения без обновления базы данных возникает SqlException:

SqlException: Invalid column name 'Rating'.

Исключение SqlException связано с тем, что обновленный класс модели Movie отличается от схемы таблицы Movie в базе данных. В таблице базы данных нет столбца Rating.

Устранить эту ошибку можно несколькими способами:

  1. Можно с помощью Entity Framework автоматически удалить и повторно создать базу данных на основе новой схемы класса модели. Этот подход удобен на ранних стадиях цикла разработки. В этом случае развитие модели и схемы базы данных осуществляется одновременно. Недостатком такого подхода является потеря существующих данных в базе. В рабочей базе данных применять этот подход не следует! При разработке приложения часто выполняется удаление базы данных при изменении схемы, для чего используется инициализатор для автоматического заполнения базы тестовыми данными.

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

  3. Можно обновить схему базы данных с помощью Code First Migrations.

В этом руководстве используется Code First Migrations.

Обновите класс SeedData так, чтобы он предоставлял значение нового столбца. Ниже приведен пример изменения, которое необходимо реализовать для каждого блока new Movie.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

См. готовый файл SeedData.cs.

Постройте решение.

Добавление миграции для поля Rating

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

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

    Add-Migration Rating
    Update-Database
    

Команда Add-Migration задает следующие инструкции для платформы:

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

В качестве имени файла переноса используется произвольное имя "Rating". Рекомендуется присваивать этому файлу понятное имя.

Команда Update-Database указывает платформе, что к базе данных нужно применить изменения схемы, а также сохранить существующие данные.

Если удалить все записи из базы данных, при инициализации она будет заполнена начальными значениями и в нее будет включено поле Rating. Это можно сделать с помощью ссылок удаления в браузере или из обозревателя объектов SQL Server (SSOX).

Другой вариант — удалить базу данных и использовать миграции для повторного создания базы данных. Удаление базы данных в SSOX:

  • Выберите базу данных в SSOX.

  • Щелкните базу данных правой кнопкой мыши и выберите Удалить.

  • Выберите Закрыть существующие соединения.

  • Нажмите ОК.

  • Обновите базу данных в PMC.

    Update-Database
    

Запустите приложение и проверьте возможность создания, редактирования и отображения фильмов с использованием поля Rating. Если база данных не заполнена начальными значениями, задайте точку останова в методе SeedData.Initialize.

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