Добавление нового поля в модель Movie и таблицу базы данных (VB)
В этом руководстве описаны основы создания веб-приложения MVC ASP.NET MVC с помощью Microsoft Visual Web Developer 2010 Express с пакетом обновления 1 (SP1), который является бесплатной версией Microsoft Visual Studio. Перед началом работы убедитесь, что вы установили необходимые компоненты, перечисленные ниже. Все их можно установить, щелкнув следующую ссылку: установщик веб-платформы. Кроме того, можно установить предварительные требования по отдельности, используя следующие ссылки:
- Предварительные требования для Visual Studio Web Developer Express с пакетом обновления 1 (SP1)
- обновление средств MVC 3 ASP.NET
- SQL Server Compact 4.0(среда выполнения и средства поддержки)
Если вы используете 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 выдает ошибку. Это упрощает отслеживание проблем во время разработки, которые можно найти только (по неясным ошибкам) во время выполнения. Функция проверки синхронизации — это то, что приводит к отображению сообщения об ошибке, которое вы только что видели.
Существует два подхода к устранению ошибки:
- Можно с помощью Entity Framework автоматически удалить и повторно создать базу данных на основе новой схемы класса модели. Этот подход очень удобно при активной разработке в тестовой базе данных, так как позволяет быстро развивать модель и схему базы данных вместе. Однако недостатком является то, что вы теряете существующие данные в базе данных, поэтому вы не хотите использовать этот подход в рабочей базе данных!
- Можно явно изменить схему существующей базы данных в соответствии с новыми классами модели. Преимущество такого подхода состоит в том, что сохраняются все данные. Это изменение можно выполнить как вручную, так и с помощью соответствующего скрипта базы данных.
В этом руководстве мы будем использовать первый подход. Сначала вы автоматически создадите базу данных 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 . При запуске приложения обнаруживается, что структура модели больше не соответствует схеме базы данных. Он автоматически создает базу данных для сопоставления новой структуры модели и заполняет базу данных примерами фильмов:
Щелкните ссылку "Создать" , чтобы добавить новый фильм. Обратите внимание, что можно добавить оценку.
Нажмите кнопку Создать. Новый фильм, включая рейтинг, теперь отображается в списке фильмов:
В этом разделе вы узнали, как изменить объекты модели и синхронизировать базу данных с изменениями. Вы также узнали, как заполнить только что созданную базу данных примерами данных, чтобы вы могли попробовать сценарии. Далее давайте рассмотрим, как можно добавить более богатую логику проверки в классы моделей и включить применение некоторых бизнес-правил.