Hinzufügen eines neuen Felds zum Modell und zur Tabelle eines Films (C#)
von Rick Anderson
Hinweis
Hier ist eine aktualisierte Version dieses Lernprogramms verfügbar, die ASP.NET MVC 5 und Visual Studio 2013 verwendet. Es ist sicherer, viel einfacher zu folgen und zeigt weitere Features.
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.
Für dieses Thema steht ein Visual Web Developer-Projekt mit C#-Quellcode zur Verfügung. Laden Sie die C#-Version herunter. Wenn Sie Visual Basic bevorzugen, wechseln Sie zu der Visual Basic-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 string Rating { get; set; }
Die vollständige Movie
Klasse sieht nun wie der folgende Code aus:
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}
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.cshtml und \Views\Movies\Create.cshtml aktualisieren, um die neue Rating
Eigenschaft zu unterstützen.
Öffnen Sie die Datei \Views\Movies\Index.cshtml, 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.cshtml-Ansichtsvorlage aussieht:
<table>
<tr>
<th></th>
<th>Title</th>
<th>Release Date</th>
<th>Genre</th>
<th>Price</th>
<th>Rating</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating )
</td>
<td>
@Html.ActionLink("Edit Me", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
Öffnen Sie als Nächstes die Datei \Views\Movies\Create.cshtml , 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(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(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;
using System.Collections.Generic;
using System.Data.Entity;
namespace MvcMovie.Models {
public class MovieInitializer : DropCreateDatabaseIfModelChanges<MovieDBContext> {
protected override void Seed(MovieDBContext context) {
var movies = new List<Movie> {
new Movie { Title = "When Harry Met Sally",
ReleaseDate=DateTime.Parse("1989-1-11"),
Genre="Romantic Comedy",
Rating="R",
Price=7.99M},
new Movie { Title = "Ghostbusters ",
ReleaseDate=DateTime.Parse("1984-3-13"),
Genre="Comedy",
Rating="R",
Price=8.99M},
new Movie { Title = "Ghostbusters 2",
ReleaseDate=DateTime.Parse("1986-2-23"),
Genre="Comedy",
Rating="R",
Price=9.99M},
new Movie { Title = "Rio Bravo",
ReleaseDate=DateTime.Parse("1959-4-15"),
Genre="Western",
Rating="R",
Price=3.99M},
};
movies.ForEach(d => context.Movies.Add(d));
}
}
}
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.
Fügen wir am Anfang der Datei zwei using-Anweisungen hinzu. Der erste Verweis auf den Entity Framework-Namespace und der zweite verweist auf den Namespace, in dem sich unsere MovieInitializer
Klasse befindet:
using System.Data.Entity; // Database.SetInitialize
using MvcMovie.Models; // MovieInitializer
Suchen Sie dann die Application_Start
Methode, und fügen Sie am Anfang der Methode einen Aufruf Database.SetInitializer
hinzu, wie unten dargestellt:
protected void Application_Start()
{
Database.SetInitializer<MovieDBContext>(new MovieInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
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.