Hinzufügen eines neuen Felds zum Modell und zur Datenbanktabelle eines Films (VB)
von Rick Anderson
In diesem Tutorial lernen Sie die Grundlagen des Erstellens einer ASP.NET MVC-Webanwendung mit Microsoft Visual Web Developer 2010 Express Service Pack 1, einer kostenlosen Version von Microsoft Visual Studio. Bevor Sie beginnen, stellen Sie sicher, dass Sie die unten aufgeführten Voraussetzungen installiert haben. Sie können alle installieren, indem Sie auf den folgenden Link klicken: Webplattform-Installer. Alternativ können Sie die erforderlichen Komponenten einzeln über die folgenden Links installieren:
- Voraussetzungen für Visual Studio Web Developer Express SP1
- ASP.NET MVC 3 Tools Update
- SQL Server Compact 4.0(runtime + tools support)
Wenn Sie Visual Studio 2010 anstelle von Visual Web Developer 2010 verwenden, installieren Sie die erforderlichen Komponenten, indem Sie auf den folgenden Link klicken: Voraussetzungen für Visual Studio 2010.
Für dieses Thema steht ein Visual Web Developer-Projekt mit VB.NET Quellcode zur Verfügung. Laden Sie die VB.NET-Version herunter. Wenn Sie C# bevorzugen, wechseln Sie zur C#-Version dieses Tutorials.
In diesem Abschnitt nehmen Sie einige Änderungen an den Modellklassen vor und erfahren, wie Sie das Datenbankschema entsprechend den Modelländerungen aktualisieren können.
Hinzufügen einer Rating-Eigenschaft zum Movie-Modell
Fügen Sie zunächst der vorhandenen Movie
Klasse eine neue Rating
Eigenschaft hinzu. Öffnen Sie die Datei Movie.cs , und fügen Sie die Rating
Eigenschaft wie folgt hinzu:
Public Property Rating() As String
Die vollständige Movie
Klasse sieht nun wie der folgende Code aus:
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
Kompilieren Sie die Anwendung mithilfe desMenübefehls Build moviedebuggen> neu.
Nachdem Sie die Model
Klasse aktualisiert haben, müssen Sie auch die Ansichtsvorlagen \Views\Movies\Index.vbhtml und \Views\Movies\Create.vbhtml aktualisieren, um die neue Rating
Eigenschaft zu unterstützen.
Öffnen Sie die Datei\Views\Movies\Index.vbhtml, und fügen Sie direkt hinter der Spalte Price eine <th>Rating</th>
Spaltenüberschrift hinzu. Fügen Sie dann am Ende der Vorlage eine <td>
Spalte hinzu, um den Wert zu rendern @item.Rating
. Im Folgenden sehen Sie, wie die aktualisierte Index.vbhtml-Ansichtsvorlage aussieht:
<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>
Öffnen Sie als Nächstes die Datei \Views\Movies\Create.vbhtml , und fügen Sie am Ende des Formulars das folgende Markup hinzu. Dadurch wird ein Textfeld gerendert, sodass Sie beim Erstellen eines neuen Films eine Bewertung angeben können.
<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>
Verwalten von Modell- und Datenbankschemaunterschieden
Sie haben jetzt den Anwendungscode aktualisiert, um die neue Rating
Eigenschaft zu unterstützen.
Führen Sie nun die Anwendung aus, und navigieren Sie zur URL /Movies . Wenn Sie dies tun, wird jedoch der folgende Fehler angezeigt:
Dieser Fehler wird angezeigt, da sich die aktualisierte Movie
Modellklasse in der Anwendung jetzt vom Schema der Movie
Tabelle der vorhandenen Datenbank unterscheidet. (Die Datenbanktabelle enthält nicht die Spalte Rating
.)
Wenn Sie entity Framework Code First verwenden, um automatisch eine Datenbank zu erstellen, wie weiter oben in diesem Tutorial, fügt Code First der Datenbank eine Tabelle hinzu, um nachzuverfolgen, ob das Schema der Datenbank mit den Modellklassen synchronisiert ist, aus denen es generiert wurde. Wenn sie nicht synchronisiert sind, löst Entity Framework einen Fehler aus. Dies erleichtert das Auffinden von Problemen zur Entwicklungszeit, die Sie andernfalls nur zur Laufzeit (durch obskure Fehler) finden. Die Synchronisierungsprüfungsfunktion bewirkt, dass die soeben angezeigte Fehlermeldung angezeigt wird.
Es gibt zwei Ansätze zum Beheben des Fehlers:
- Lassen Sie die Datenbank von Entity Framework automatisch löschen und basierend auf dem neuen Modellklassenschema neu erstellen. Dieser Ansatz ist bei der aktiven Entwicklung einer Testdatenbank sehr praktisch, da Sie das Modell und das Datenbankschema schnell gemeinsam weiterentwickeln können. Der Nachteil besteht jedoch darin, dass vorhandene Daten in der Datenbank verloren gehen . Sie möchten diesen Ansatz also nicht für eine Produktionsdatenbank verwenden!
- Ändern Sie das Schema der vorhandenen Datenbank explizit so, dass es mit den Modellklassen übereinstimmt. Der Vorteil dieses Ansatzes ist, dass Sie Ihre Daten behalten. Sie können diese Änderung entweder manuell oder durch Erstellen eines Änderungsskripts für die Datenbank vornehmen.
In diesem Tutorial verwenden wir den ersten Ansatz: Sie müssen die Datenbank mit Entity Framework Code First automatisch neu erstellen, wenn sich das Modell ändert.
Automatisches Re-Creating der Datenbank bei Modelländerungen
Aktualisieren wir die Anwendung so, dass Code First die Datenbank automatisch abwirft und neu erstellt, wenn Sie das Modell für die Anwendung ändern.
Hinweis
Warnung Sie sollten diesen Ansatz des automatischen Löschens und erneuten Erstellens der Datenbank nur aktivieren, wenn Sie eine Entwicklungs- oder Testdatenbank verwenden, und niemals in einer Produktionsdatenbank, die echte Daten enthält. Die Verwendung auf einem Produktionsserver kann zu Datenverlusten führen.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Models, wählen Sie Hinzufügen und dann Klasse aus.
Nennen Sie die Klasse "MovieInitializer". Aktualisieren Sie die MovieInitializer
-Klasse so, dass sie den folgenden Code enthält:
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
Die MovieInitializer
-Klasse gibt an, dass die vom Modell verwendete Datenbank gelöscht und automatisch neu erstellt werden soll, wenn sich die Modellklassen ändern. Der Code enthält eine Seed
Methode zum Angeben einiger Standarddaten, die automatisch zur Datenbank hinzugefügt werden sollen, wenn sie erstellt (oder neu erstellt) werden. Dies bietet eine nützliche Möglichkeit, die Datenbank mit einigen Beispieldaten aufzufüllen, ohne dass Sie sie bei jeder Modelländerung manuell auffüllen müssen.
Nachdem Sie die MovieInitializer
-Klasse definiert haben, sollten Sie sie so verknüpfen, dass bei jeder Ausführung der Anwendung überprüft wird, ob sich die Modellklassen vom Schema in der Datenbank unterscheiden. Wenn ja, können Sie den Initialisierer ausführen, um die Datenbank so neu zu erstellen, dass sie dem Modell entspricht, und dann die Datenbank mit den Beispieldaten auffüllen.
Öffnen Sie die Datei Global.asax , die sich im Stammverzeichnis des MvcMovies
Projekts befindet:
Die Datei Global.asax enthält die Klasse, die die gesamte Anwendung für das Projekt definiert, und enthält einen Application_Start
Ereignishandler, der beim ersten Start der Anwendung ausgeführt wird.
Suchen Sie die Application_Start
-Methode, und fügen Sie einen Aufruf Database.SetInitializer
von am Anfang der Methode hinzu, wie unten gezeigt:
Sub Application_Start()
System.Data.Entity.Database.SetInitializer(Of MovieDBContext)(New MvcMovie.Models.MovieInitializer())
AreaRegistration.RegisterAllAreas()
RegisterGlobalFilters(GlobalFilters.Filters)
RegisterRoutes(RouteTable.Routes)
End Sub
Die Database.SetInitializer
soeben hinzugefügte Anweisung gibt an, dass die vom MovieDBContext
instance verwendete Datenbank automatisch gelöscht und neu erstellt werden soll, wenn das Schema und die Datenbank nicht übereinstimmen. Und wie Sie gesehen haben, wird die Datenbank auch mit den Beispieldaten aufgefüllt, die in der MovieInitializer
-Klasse angegeben sind.
Schließen Sie die Datei Global.asax .
Führen Sie die Anwendung erneut aus, und navigieren Sie zur /Movies-URL . Wenn die Anwendung gestartet wird, wird erkannt, dass die Modellstruktur nicht mehr mit dem Datenbankschema übereinstimmt. Die Datenbank wird automatisch neu erstellt, um der neuen Modellstruktur zu entsprechen, und die Datenbank wird mit den Beispielfilmen aufgefüllt:
Klicken Sie auf den Link Neu erstellen , um einen neuen Film hinzuzufügen. Beachten Sie, dass Sie eine Bewertung hinzufügen können.
Klicken Sie auf Erstellen. Der neue Film, einschließlich der Bewertung, wird jetzt in der Filmliste angezeigt:
In diesem Abschnitt haben Sie erfahren, wie Sie Modellobjekte ändern und die Datenbank mit den Änderungen synchronisieren können. Außerdem haben Sie eine Möglichkeit kennengelernt, eine neu erstellte Datenbank mit Beispieldaten aufzufüllen, damit Sie Szenarien ausprobieren können. Als Nächstes sehen wir uns an, wie Sie den Modellklassen eine umfassendere Validierungslogik hinzufügen und einige Geschäftsregeln erzwingen können.