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


Добавление нового поля в модель и таблицу Movie

Рик Андерсон

Примечание.

Обновленная версия этого руководства доступна здесь , где используется ASP.NET MVC 5 и Visual Studio 2013. Это более безопасно, гораздо проще следовать и демонстрирует больше функций.

В этом разделе вы будете использовать миграцию Entity Framework Code First Migrations для переноса некоторых изменений в классы моделей, чтобы изменения применялись к базе данных.

По умолчанию при использовании Entity Framework Code First для автоматического создания базы данных, как и ранее в этом руководстве, Code First добавляет таблицу в базу данных, чтобы отслеживать, синхронизирована ли схема базы данных с классами моделей, из них она была создана. Если они не синхронизированы, Entity Framework выдает ошибку. Это упрощает отслеживание проблем во время разработки, которые можно найти только (по неясным ошибкам) во время выполнения.

Настройка первых миграций кода для изменений модели

Если вы используете Visual Studio 2012, дважды щелкните файл Movies.mdf из Обозреватель решений, чтобы открыть средство базы данных. Visual Studio Express для Интернета отобразит Обозреватель баз данных, Visual Studio 2012 будет отображать обозреватель серверов. Если вы используете Visual Studio 2010, используйте обозреватель объектов SQL Server.

В средстве базы данных (Обозреватель баз данных, обозреватель сервера или SQL Server обозреватель объектов) щелкните правой кнопкой мыши MovieDBContext и выберите "Удалить", чтобы удалить базу данных фильмов.

Снимок экрана: окно обозревателя серверов. Удаление выбрано в контекстном меню

Вернитесь к Обозреватель решений. Щелкните правой кнопкой мыши файл Movies.mdf и выберите "Удалить ", чтобы удалить базу данных фильмов.

Снимок экрана: окно Обозреватель решений. Удаление выбрано в меню пункт

Постройте приложение, чтобы убедиться в отсутствии ошибок.

В меню Сервис щелкните Диспетчер пакетов NuGet, а затем щелкните Консоль диспетчера пакетов.

Добавление человека с пакетом

В окне консоли диспетчер пакетов в PM> командной строке введите "Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext".

Снимок экрана: окно консоли диспетчер пакетов. Введите команду Enable Migrations.

Команда Enable-Migrations (показана выше) создает файл Configuration.cs в новой папке Migrations .

Снимок экрана: окно Обозреватель решений. Папка

Visual Studio открывает файл Configuration.cs . Замените Seed метод в файле Configuration.cs следующим кодом:

protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
    context.Movies.AddOrUpdate( i => i.Title,
        new Movie
        {
            Title = "When Harry Met Sally",
            ReleaseDate = DateTime.Parse("1989-1-11"),
            Genre = "Romantic Comedy",
            Price = 7.99M
        },

         new Movie
         {
             Title = "Ghostbusters ",
             ReleaseDate = DateTime.Parse("1984-3-13"),
             Genre = "Comedy",
             Price = 8.99M
         },

         new Movie
         {
             Title = "Ghostbusters 2",
             ReleaseDate = DateTime.Parse("1986-2-23"),
             Genre = "Comedy",
             Price = 9.99M
         },

       new Movie
       {
           Title = "Rio Bravo",
           ReleaseDate = DateTime.Parse("1959-4-15"),
           Genre = "Western",
           Price = 3.99M
       }
   );
   
}

Щелкните правой кнопкой мыши красную линию в разделе Movie и выберите "Разрешить ", а затем с помощью MvcMovie.Models;

Снимок экрана: пункт

При этом добавляется следующая инструкция using:

using MvcMovie.Models;

Примечание.

Code First Migrations вызывает Seed метод после каждой миграции (то есть вызов update-database в консоли диспетчер пакетов), и этот метод обновляет строки, которые уже вставлены, или вставляет их, если они еще не существуют.

Нажмите клавиши CTRL-SHIFT-B, чтобы создать проект.(Следующие шаги завершаются ошибкой, если сборка не выполняется на этом этапе.)

Следующим шагом является создание класса для начальной DbMigration миграции. Эта миграция для создания новой базы данных, поэтому вы удалили файл movie.mdf на предыдущем шаге.

В окне консоли диспетчер пакетов введите команду add-migration Initial, чтобы создать начальную миграцию. Имя "Initial" является произвольным и используется для имени созданного файла миграции.

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

Code First Migrations создает другой файл класса в папке Migrations (с именем {DateStamp}_Initial.cs ), а этот класс содержит код, который создает схему базы данных. Имя файла миграции предварительно исправлено с меткой времени для упорядочения. Изучите файл {DateStamp}_Initial.cs , в нем содержатся инструкции по созданию таблицы "Фильмы" для базы данных "Фильм". При обновлении базы данных в приведенных ниже инструкциях этот файл {DateStamp}_Initial.cs будет запускаться и создавать схему базы данных. Затем метод Seed будет выполняться для заполнения базы данных тестовых данных.

В консоли диспетчер пакетов введите команду update-database, чтобы создать базу данных и запустить метод Seed.

Снимок экрана: окно консоли диспетчер пакетов. Введите команду базы данных обновления.

Если возникает ошибка, указывающая, что таблица уже существует и не может быть создана, вероятно, это связано с тем, что вы запустили приложение после удаления базы данных и перед выполнением.update-database В этом случае удалите файл Movies.mdf еще раз и повторите update-database команду. Если вы по-прежнему получите ошибку, удалите папку миграции и содержимое, а затем начните с инструкций в верхней части этой страницы (то есть удалите файл Movies.mdf , а затем перейдите к enable-Migrations).

Запустите приложение и перейдите по URL-адресу /Movies . Отображаются начальные данные.

Снимок экрана: страница индекса фильма M V C со списком четырех фильмов.

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

Начните с добавления нового Rating свойства в существующий Movie класс. Откройте файл Models\Movie.cs и добавьте следующее Rating свойство:

public string Rating { get; set; }

Полный Movie класс теперь выглядит следующим образом:

public class Movie
{
    public int ID { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }
    public string Rating { get; set; }
}

Создайте приложение с помощью команды меню ">Сборка фильма сборки" или нажав клавиши CTRL-SHIFT-B.

Теперь, когда вы обновили Model класс, необходимо также обновить шаблоны представлений \Views\Movies\Index.cshtml и \Views\Movies\Create.cshtml, чтобы отобразить новое Rating свойство в представлении браузера.

Откройте файл\Views\Movies\Index.cshtml и добавьте <th>Rating</th> заголовок столбца сразу после столбца Price. Затем добавьте <td> столбец в конце шаблона для отрисовки @item.Rating значения. Ниже показано, как выглядит обновленный шаблон представления Index.cshtml :

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Price)
        </th>
         <th>
            @Html.DisplayNameFor(model => model.Rating)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <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>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

Затем откройте файл \Views\Movies\Create.cshtml и добавьте следующую разметку в конце формы. Это отрисовывает текстовое поле, чтобы можно было указать оценку при создании нового фильма.

<div class="editor-label">
    @Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Rating)
    @Html.ValidationMessageFor(model => model.Rating)
</div>

Теперь вы обновили код приложения для поддержки нового Rating свойства.

Теперь запустите приложение и перейдите по URL-адресу /Movies . Однако при этом вы увидите одну из следующих ошибок:

Снимок экрана: ошибка

Снимок экрана: окно браузера с ошибкой, которая указывает на ошибку сервера в приложении.

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

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

  1. Можно с помощью Entity Framework автоматически удалить и повторно создать базу данных на основе новой схемы класса модели. Этот подход очень удобно при активной разработке в тестовой базе данных; он позволяет быстро развивать схему модели и базы данных вместе. Однако недостатком является то, что вы теряете существующие данные в базе данных, поэтому вы не хотите использовать этот подход в рабочей базе данных! Использование инициализатора для автоматического заполнения базы данных с тестовых данных часто является продуктивным способом разработки приложения. Дополнительные сведения о инициализаторах баз данных Entity Framework см. в руководстве по ASP.NET MVC/Entity Framework Tom Dykstra.
  2. Можно явно изменить схему существующей базы данных в соответствии с новыми классами модели. Преимущество такого подхода состоит в том, что сохраняются все данные. Это изменение можно выполнить как вручную, так и с помощью соответствующего скрипта базы данных.
  3. Можно обновить схему базы данных с помощью Code First Migrations.

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

Обновите метод Seed таким образом, чтобы он предоставлял значение для нового столбца. Откройте файл Migrations\Configuration.cs и добавьте поле "Рейтинг" в каждый объект Movie.

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

Создайте решение, а затем откройте окно консоли диспетчер пакетов и введите следующую команду:

add-migration AddRatingMig

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

По завершении этой команды Visual Studio открывает файл класса, определяющий новый DbMigration производный класс, и в методе Up можно увидеть код, создающий новый столбец.

public partial class AddRatingMig : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Movies", "Rating", c => c.String());
    }
    
    public override void Down()
    {
        DropColumn("dbo.Movies", "Rating");
    }
}

Создайте решение и введите команду update-database в окне консоли диспетчер пакетов.

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

Снимок экрана: команда базы данных обновления.

Повторно запустите приложение и перейдите по URL-адресу /Movies. Вы можете увидеть новое поле "Оценка".

Снимок экрана: страница индекса фильма M V C с четырьмя фильмами, перечисленными в списке.

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

7_CreateRioII

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

7_ourNewMovie_SM

Вы также должны добавить Rating поле в шаблоны представлений Edit, Details и SearchIndex.

Вы можете снова ввести команду update-database в окне консоли диспетчер пакетов и не вносить никаких изменений, так как схема соответствует модели.

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