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


Добавление нового поля в модель Movie и таблицу базы данных (VB)

Рик Андерсон

В этом руководстве описаны основы создания веб-приложения MVC ASP.NET MVC с помощью Microsoft Visual Web Developer 2010 Express с пакетом обновления 1 (SP1), который является бесплатной версией Microsoft Visual Studio. Перед началом работы убедитесь, что вы установили необходимые компоненты, перечисленные ниже. Все их можно установить, щелкнув следующую ссылку: установщик веб-платформы. Кроме того, можно установить предварительные требования по отдельности, используя следующие ссылки:

Если вы используете Visual Studio 2010 вместо Visual Web Developer 2010, установите необходимые компоненты, щелкнув следующую ссылку: предварительные требования Visual Studio 2010.

Проект Visual Web Developer с VB.NET исходный код доступен для сопровождения этого раздела. Скачайте версию VB.NET. Если вы предпочитаете C#, перейдите к версии C# этого руководства.

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

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

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

Public Property Rating() As String

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

Public Class Movie
    Public Property ID() As Integer
    Public Property Title() As String
    Public Property ReleaseDate() As Date
    Public Property Genre() As String
    Public Property Price() As Decimal
    Public Property Rating() As String
End Class

Перекомпилируйте приложение с помощью команды меню "Отладка>сборки фильма".

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

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

<table>
    <tr>
        <th>            Title        </th>
        <th>            ReleaseDate        </th>
        <th>            Genre        </th>
        <th>            Price        </th>
        <th>Rating</th>
        <th></th>
    </tr>

@For Each item In Model
    Dim currentItem = item
    @<tr>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Title)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Genre)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Price)
        </td>
         <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Rating)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", New With {.id = currentItem.ID}) |
            @Html.ActionLink("Details", "Details", New With {.id = currentItem.ID}) |
            @Html.ActionLink("Delete", "Delete", New With {.id = currentItem.ID})
        </td>
    </tr>
Next

</table>

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

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

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

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

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

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

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

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

Существует два подхода к устранению ошибки:

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

В этом руководстве мы будем использовать первый подход. Сначала вы автоматически создадите базу данных entity Framework Code в любое время изменения модели.

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

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

Примечание.

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

В Обозреватель решений щелкните правой кнопкой мыши папку "Модели", выберите "Добавить" и выберите "Класс".

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

Назовите класс MovieInitializer. Обновите класс, MovieInitializer чтобы он содержал следующий код:

using System;
Imports System
Imports System.Collections.Generic
Imports System.Data.Entity

Namespace MvcMovie.Models
    Public Class MovieInitializer
        Inherits DropCreateDatabaseIfModelChanges(Of MovieDBContext)
        Protected Overrides Sub Seed(ByVal context As MovieDBContext)
            Dim movies = New List(Of Movie) From {
             New Movie With {.Title = "When Harry Met Sally", .ReleaseDate = Date.Parse("1989-1-11"), .Genre = "Romantic Comedy", .Rating = "R", .Price = 7.99D},
             New Movie With {.Title = "Ghostbusters ", .ReleaseDate = Date.Parse("1984-3-13"), .Genre = "Comedy", .Rating = "R", .Price = 8.99D},
             New Movie With {.Title = "Ghostbusters 2", .ReleaseDate = Date.Parse("1986-2-23"), .Genre = "Comedy", .Rating = "R", .Price = 9.99D},
             New Movie With {.Title = "Rio Bravo", .ReleaseDate = Date.Parse("1959-4-15"), .Genre = "Western", .Rating = "R", .Price = 3.99D}}

            movies.ForEach(Function(d) context.Movies.Add(d))
        End Sub
    End Class
End Namespace

Класс MovieInitializer указывает, что база данных, используемая моделью, должна быть удалена и автоматически повторно создана, если классы модели когда-либо изменяются. Код включает метод, указывающий Seed некоторые данные по умолчанию для автоматического добавления в базу данных в любой момент его создания (или повторного создания). Это позволяет заполнять базу данных примерами данных без необходимости вручную заполнять ее при каждом изменении модели.

Теперь, когда вы определили MovieInitializer класс, необходимо подключить его таким образом, чтобы при каждом запуске приложения проверялось, отличаются ли классы модели от схемы в базе данных. Если это так, можно запустить инициализатор, чтобы повторно создать базу данных для сопоставления модели, а затем заполнить базу данных примерами данных.

Откройте файл Global.asax, который находится в корне MvcMovies проекта:

Файл Global.asax содержит класс, определяющий все приложение для проекта, и содержит Application_Start обработчик событий, который запускается при первом запуске приложения.

Application_Start Найдите метод и добавьте вызов Database.SetInitializer в начало метода, как показано ниже:

Sub Application_Start()
        System.Data.Entity.Database.SetInitializer(Of MovieDBContext)(New MvcMovie.Models.MovieInitializer())
       
        AreaRegistration.RegisterAllAreas()

        RegisterGlobalFilters(GlobalFilters.Filters)
        RegisterRoutes(RouteTable.Routes)
    End Sub

Только Database.SetInitializer что добавленная инструкция указывает, что база данных, используемая MovieDBContext экземпляром, должна быть автоматически удалена и повторно создана, если схема и база данных не совпадают. И, как вы видели, он также заполняет базу данных примерами данных, указанными MovieInitializer в классе.

Закройте файл Global.asax.

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

7_MyMovieList_SM

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

7_CreateRioII

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

7_ourNewMovie_SM

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