Freigeben über


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:

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:

Screenshot, der ein Browserfenster mit einem Fehler zeigt, der serverfehler in Der Anwendung angibt.

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:

  1. 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!
  2. Ä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.

Screenshot: Fenster

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:

7_MyMovieList_SM

Klicken Sie auf den Link Neu erstellen , um einen neuen Film hinzuzufügen. Beachten Sie, dass Sie eine Bewertung hinzufügen können.

7_CreateRioII

Klicken Sie auf Erstellen. Der neue Film, einschließlich der Bewertung, wird jetzt in der Filmliste angezeigt:

7_ourNewMovie_SM

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.