Ajout d’un nouveau champ à la table et au modèle Movie (C#)
par Rick Anderson
Remarque
Une version mise à jour de ce didacticiel est disponible ici qui utilise ASP.NET MVC 5 et Visual Studio 2013. Il est plus sécurisé, beaucoup plus simple à suivre et montre plus de fonctionnalités.
Ce tutoriel vous apprend les principes de base de la création d’une application web MVC ASP.NET à l’aide de Microsoft Visual Web Developer 2010 Express Service Pack 1, qui est une version gratuite de Microsoft Visual Studio. Avant de commencer, vérifiez que vous avez installé les conditions préalables répertoriées ci-dessous. Vous pouvez les installer en cliquant sur le lien suivant : Web Platform Installer. Vous pouvez également installer individuellement les prérequis à l’aide des liens suivants :
- Conditions préalables pour Visual Studio Web Developer Express SP1
- mise à jour des outils MVC 3 ASP.NET
- SQL Server Compact 4.0(runtime + prise en charge des outils)
Si vous utilisez Visual Studio 2010 au lieu de Visual Web Developer 2010, installez les prérequis en cliquant sur le lien suivant : Conditions préalables pour Visual Studio 2010.
Un projet Visual Web Developer avec du code source C# est disponible pour accompagner cette rubrique. Téléchargez la version C#. Si vous préférez Visual Basic, basculez vers la version Visual Basic de ce didacticiel.
Dans cette section, vous allez apporter des modifications aux classes de modèle et découvrir comment mettre à jour le schéma de base de données pour qu’il corresponde aux modifications apportées au modèle.
Ajout d’une propriété Rating au modèle Movie
Commencez par ajouter une nouvelle Rating
propriété à la classe existante Movie
. Ouvrez le fichier Movie.cs et ajoutez la Rating
propriété comme celle-ci :
public string Rating { get; set; }
La classe complète Movie
ressemble maintenant au code suivant :
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; }
}
Recompilez l’application à l’aide de la commande Debug>Build Movie.
Maintenant que vous avez mis à jour la Model
classe, vous devez également mettre à jour les modèles de vue \Views\Movies\Index.cshtml et \Views\Movies\Create.cshtml pour prendre en charge la nouvelle Rating
propriété.
Ouvrez le fichier \Views\Movies\Index.cshtml et ajoutez un <th>Rating</th>
en-tête de colonne juste après la colonne Price . Ajoutez ensuite une <td>
colonne près de la fin du modèle pour afficher la @item.Rating
valeur. Voici à quoi ressemble le modèle de vue Index.cshtml mis à jour :
<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>
Ensuite, ouvrez le fichier \Views\Movies\Create.cshtml et ajoutez le balisage suivant à la fin du formulaire. Cela restitue une zone de texte afin que vous puissiez spécifier une évaluation lors de la création d’un nouveau film.
<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>
Gestion des différences de schéma de modèle et de base de données
Vous avez maintenant mis à jour le code de l’application pour prendre en charge la nouvelle Rating
propriété.
Exécutez maintenant l’application et accédez à l’URL /Movies . Toutefois, lorsque vous effectuez cette opération, vous verrez l’erreur suivante :
Cette erreur s’affiche, car la classe de modèle mise à jour Movie
dans l’application est désormais différente du schéma de la Movie
table de la base de données existante. (Il n’existe pas de colonne Rating
dans la table de base de données.)
Par défaut, lorsque vous utilisez Entity Framework Code First pour créer automatiquement une base de données, comme vous l’avez fait précédemment dans ce didacticiel, Code First ajoute une table à la base de données pour vous aider à déterminer si le schéma de la base de données est synchronisé avec les classes de modèle à partir de laquelle elle a été générée. S’ils ne sont pas synchronisés, Entity Framework génère une erreur. Cela facilite le suivi des problèmes au moment du développement que vous pouvez trouver (par des erreurs obscures) au moment de l’exécution. La fonctionnalité de vérification de la synchronisation est ce qui provoque l’affichage du message d’erreur que vous venez de voir.
Il existe deux approches pour résoudre l’erreur :
- Laissez Entity Framework supprimer et recréer automatiquement la base de données sur la base du nouveau schéma de classe de modèle. Cette approche est très pratique quand vous effectuez un développement actif sur une base de données de test, car elle vous permet d’évoluer rapidement le modèle et le schéma de base de données ensemble. L’inconvénient, cependant, est que vous perdez des données existantes dans la base de données . Vous ne souhaitez donc pas utiliser cette approche sur une base de données de production !
- Modifier explicitement le schéma de la base de données existante pour le faire correspondre aux classes du modèle. L’avantage de cette approche est que vous conservez vos données. Vous pouvez apporter cette modification manuellement ou en créant un script de modification de la base de données.
Pour ce tutoriel, nous allons utiliser la première approche : vous devez d’abord recréer automatiquement la base de données à chaque modification du modèle.
Recréer automatiquement la base de données sur les modifications de modèle
Nous allons mettre à jour l’application afin que Code First supprime et recrée automatiquement la base de données chaque fois que vous modifiez le modèle de l’application.
Remarque
Avertissement : vous devez activer cette approche de suppression et de recréation automatique de la base de données uniquement lorsque vous utilisez une base de données de développement ou de test, et jamais sur une base de données de production qui contient des données réelles. L’utilisation sur un serveur de production peut entraîner une perte de données.
Dans Explorateur de solutions, cliquez avec le bouton droit sur le dossier Modèles, sélectionnez Ajouter, puis sélectionnez Classe.
Nommez la classe « MovieInitializer ». Mettez à jour la MovieInitializer
classe pour contenir le code suivant :
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));
}
}
}
La MovieInitializer
classe spécifie que la base de données utilisée par le modèle doit être supprimée et recréée automatiquement si les classes de modèle changent. Le code inclut une Seed
méthode pour spécifier certaines données par défaut à ajouter automatiquement à la base de données à tout moment où elle est créée (ou recréé). Cela permet de remplir la base de données avec des exemples de données, sans vous obliger à le remplir manuellement chaque fois que vous apportez une modification de modèle.
Maintenant que vous avez défini la MovieInitializer
classe, vous souhaitez la relier afin que chaque fois que l’application s’exécute, elle vérifie si les classes de modèle sont différentes du schéma de la base de données. Si c’est le cas, vous pouvez exécuter l’initialiseur pour recréer la base de données pour qu’elle corresponde au modèle, puis remplir la base de données avec les exemples de données.
Ouvrez le fichier Global.asax à la racine du MvcMovies
projet :
Le fichier Global.asax contient la classe qui définit l’ensemble de l’application pour le projet et contient un gestionnaire d’événements Application_Start
qui s’exécute lors du premier démarrage de l’application.
Ajoutons deux instructions using en haut du fichier. Le premier fait référence à l’espace de noms Entity Framework, et le deuxième fait référence à l’espace de noms où se trouve notre MovieInitializer
classe :
using System.Data.Entity; // Database.SetInitialize
using MvcMovie.Models; // MovieInitializer
Recherchez ensuite la Application_Start
méthode et ajoutez un appel au Database.SetInitializer
début de la méthode, comme indiqué ci-dessous :
protected void Application_Start()
{
Database.SetInitializer<MovieDBContext>(new MovieInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
L’instruction Database.SetInitializer
que vous venez d’ajouter indique que la base de données utilisée par l’instance MovieDBContext
doit être automatiquement supprimée et recréée si le schéma et la base de données ne correspondent pas. Comme vous l’avez vu, elle remplit également la base de données avec les exemples de données spécifiés dans la MovieInitializer
classe.
Fermez le fichier Global.asax .
Réexécutez l’application et accédez à l’URL /Movies . Au démarrage de l’application, elle détecte que la structure du modèle ne correspond plus au schéma de base de données. Il recrée automatiquement la base de données pour qu’elle corresponde à la nouvelle structure de modèle et remplit la base de données avec les exemples de films :
Cliquez sur le lien Créer un nouveau film pour ajouter un nouveau film. Notez que vous pouvez ajouter une évaluation.
Cliquez sur Créer. Le nouveau film, y compris l’évaluation, apparaît maintenant dans la liste des films :
Dans cette section, vous avez vu comment modifier des objets de modèle et maintenir la base de données synchronisée avec les modifications. Vous avez également appris à remplir une base de données nouvellement créée avec des exemples de données afin de pouvoir tester des scénarios. Examinons ensuite comment ajouter une logique de validation plus riche aux classes de modèle et permettre à certaines règles métier d’être appliquées.