Добавление нового поля

Rick Anderson

В этом разделе мы будем использовать Entity Framework Code First, чтобы добавить в модель новое поле и перенести это изменение в БД.

Когда вы используете EF Code First для автоматического создания БД, Code First добавляет в БД таблицу, чтобы отслеживать, синхронизирована ли схема БД с классами модели, от которых она была сгенерирована. Если они не синхронизированы, EF выбрасывает исключение. Это упрощает отслеживание во время разработки таких проблем, которые в ином случае вы могли бы заметить только в рантайме.

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

Откройте файл 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; }
    public decimal Price { get; set; }
    public string Rating { get; set; }
}

Соберите приложение (Ctrl+Shift+B).

Поскольку вы добавили в класс Movie новое поле, вам также нужно обновить связующий список, чтобы туда было включено новое свойство. Обновите атрибут [Bind] для методов действия Create и Edit, чтобы он включал в себя свойство Rating:

[Bind("ID,Title,ReleaseDate,Genre,Price,Rating")]

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

Отредактируйте файл /Views/Movies/Index.cshtml, то есть добавьте поле Rating:

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.movies[0].Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.movies[0].Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.movies[0].ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.movies[0].Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.movies[0].Rating)
        </th>
        <th></th>
    </tr>
    <tbody>
        @foreach (var item in Model.movies)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Genre)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Price)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.ReleaseDate)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Title)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Rating)
                </td>

Обновите /Views/Movies/Create.cshtml с полем Rating. Вы можете скопировать/вставить предыдущую “формовую группу”, а intelliSense поможет вам обновить поля. IntelliSense работает с тег-хелперами.

../../_images/cr.png

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

../../_images/se1.png

Это происходит потому, что обновленный класс модели Movie отличается от схемы таблицы Movie существующей БД. (В таблице БД нет колонки Rating).

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

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

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

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

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

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

Вы должны остановить IIS Express, прежде чем запустить команды dotnet ef. См. Остановка IIS Express:

Соберите приложение и откройте командную строку. Введите следующие команды:

dotnet ef migrations add Rating
dotnet ef database update

Команда migrations add говорит фреймворку миграции изучить текущую модель Movie с текущей БД схемой Movie и создать необходимый код для миграции БД в новую модель. Имя “Rating” не обязательно и используется для именования файла миграции. Здесь полезно использовать значимое имя.

Если вы удалите из БД все записи, инициализатор заполнит БД и включит туда поле Rating. Вы можете сделать это с помощью ссылок delete в браузере или из SSOX.

Запустите приложение и проверьте, что вы можете создавать/редактировать/отображать ролики с полем Rating. Также вам надо добавить поле Rating в шаблоны представлений Edit, Details и Delete.

Поделись хорошей новостью с друзьями!
Следи за новостями!