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

Примечание.

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

Внимание

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

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

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

В этом разделе 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.

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