Hinzufügen eines neuen Felds zum Modell und zur Datenbanktabelle eines Films (VB)
von Rick Anderson
In diesem Lernprogramm lernen Sie die Grundlagen zum Erstellen einer ASP.NET MVC-Webanwendung mithilfe von 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: Web Platform Installer. Alternativ können Sie die erforderlichen Komponenten mit den folgenden Links einzeln installieren:
- Voraussetzungen für Visual Studio Web Developer Express SP1
- ASP.NET MVC 3 Tools Update
- SQL Server Compact 4.0(Runtime + Tools-Unterstützung)
Wenn Sie Visual Studio 2010 anstelle von Visual Web Developer 2010 verwenden, installieren Sie die erforderlichen Komponenten, indem Sie auf den folgenden Link klicken: Visual Studio 2010-Voraussetzungen.
Ein Visual Web Developer-Projekt mit VB.NET Quellcode steht diesem Thema zur Verfügung. Laden Sie die VB.NET-Version herunter. Wenn Sie C# bevorzugen, wechseln Sie zu der C#-Version dieses Lernprogramms.
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
Beginnen Sie, indem Sie der vorhandenen Movie
Klasse eine neue Rating
Eigenschaft hinzufügen. Ö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 des Menübefehls "Debug>Build Movie".
Nachdem Sie die Model
Klasse aktualisiert haben, müssen Sie auch die Vorlagen \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 "Preis" eine <th>Rating</th>
Spaltenüberschrift hinzu. Fügen Sie dann eine <td>
Spalte am Ende der Vorlage hinzu, um den @item.Rating
Wert zu rendern. Nachfolgend 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 das folgende Markup am Ende des Formulars 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 nun den Anwendungscode aktualisiert, um die neue Rating
Eigenschaft zu unterstützen.
Führen Sie nun die Anwendung aus, und navigieren Sie zur URL "/Movies ". In diesem Fall wird jedoch der folgende Fehler angezeigt:
Dieser Fehler wird angezeigt, da sich die aktualisierte Movie
Modellklasse in der Anwendung jetzt von dem Schema der Movie
Tabelle der vorhandenen Datenbank unterscheidet. (Die Datenbanktabelle enthält nicht die Spalte Rating
.)
Wenn Sie entity Framework Code First zum automatischen Erstellen einer Datenbank verwenden, wie sie in diesem Lernprogramm bereits erwähnt haben, fügt Code First der Datenbank eine Tabelle hinzu, um nachzuverfolgen, ob das Schema der Datenbank mit den Modellklassen synchronisiert ist, aus denen sie generiert wurde. Wenn sie nicht synchronisiert sind, löst Entity Framework einen Fehler aus. Dies erleichtert das Auffinden von Problemen zur Entwicklungszeit, die sonst nur zur Laufzeit (durch verdeckte Fehler) gefunden werden können. Das Synchronisierungsüberprüfungsfeature 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 sehr praktisch, wenn Sie die aktive Entwicklung in einer Testdatenbank durchführen, da sie es Ihnen ermöglicht, das Modell und das Datenbankschema schnell zusammen zu entwickeln. Der Nachteil ist jedoch, dass Sie vorhandene Daten in der Datenbank verlieren – daher möchten Sie diesen Ansatz 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 Lernprogramm verwenden wir den ersten Ansatz – Sie haben den Entity Framework Code First automatisch neu erstellt, wenn sich das Modell ändert.
Automatisches Erneutes Erstellen der Datenbank bei Modelländerungen
Aktualisieren wir die Anwendung so, dass Code First automatisch abbricht und die Datenbank neu erstellt, wenn Sie das Modell für die Anwendung ändern.
Hinweis
Warnung Sie sollten diesen Ansatz zum automatischen Ablegen und erneuten Erstellen der Datenbank aktivieren, nur 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 "Modelle", 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 jemals ändern. Der Code enthält eine Seed
Methode, um einige Standarddaten anzugeben, die der Datenbank automatisch hinzugefügt werden sollen, wenn sie erstellt (oder neu erstellt) wird. Dies bietet eine nützliche Möglichkeit zum Auffüllen der Datenbank mit einigen Beispieldaten, ohne dass Sie sie jedes Mal manuell auffüllen müssen, wenn Sie eine Modelländerung vornehmen.
Nachdem Sie die MovieInitializer
Klasse definiert haben, sollten Sie sie so verbinden, 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 erneut zu erstellen, um dem Modell zu entsprechen, 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 Starten der Anwendung ausgeführt wird.
Suchen Sie die Application_Start
Methode, und fügen Sie am Anfang der Methode einen Aufruf Database.SetInitializer
hinzu, wie unten dargestellt:
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 von der MovieDBContext
Instanz verwendete Datenbank automatisch gelöscht und neu erstellt werden soll, wenn das Schema und die Datenbank nicht übereinstimmen. Und wie Sie gesehen haben, füllt sie auch die Datenbank mit den Beispieldaten auf, 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 URL "/Movies ". Wenn die Anwendung gestartet wird, wird erkannt, dass die Modellstruktur nicht mehr mit dem Datenbankschema übereinstimmt. Sie erstellt die Datenbank automatisch neu, um der neuen Modellstruktur zu entsprechen, und füllt die Datenbank mit den Beispielfilmen auf:
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 im Filmeintrag angezeigt:
In diesem Abschnitt haben Sie gesehen, wie Sie Modellobjekte ändern und die Datenbank mit den Änderungen synchronisieren können. Außerdem haben Sie gelernt, wie Sie eine neu erstellte Datenbank mit Beispieldaten auffüllen können, damit Sie Szenarien ausprobieren können. Als Nächstes sehen wir uns an, wie Sie den Modellklassen eine umfangreichere Validierungslogik hinzufügen und einige Geschäftsregeln erzwingen können.