Partager via


Ajout d’un nouveau champ à la table et au modèle Movie (VB)

par Rick Anderson

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 :

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 VB.NET code source est disponible pour accompagner cette rubrique. Téléchargez la version VB.NET. Si vous préférez C#, basculez vers la version C# 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 Property Rating() As String

La classe complète Movie ressemble maintenant au code suivant :

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

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.vbhtml et \Views\Movies\Create.vbhtml afin de prendre en charge la nouvelle Rating propriété.

Ouvrez le fichier\Views\Movies\Index.vbhtml 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.vbhtml mis à jour :

<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>

Ensuite, ouvrez le fichier \Views\Movies\Create.vbhtml 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(Function(model) model.Rating)
 </div>
 <div class="editor-field">
     @Html.EditorFor(Function(model) model.Rating)
     @Html.ValidationMessageFor(Function(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 :

Capture d’écran montrant une fenêtre de navigateur avec une erreur indiquant l’erreur du serveur dans l’application.

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 :

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

Capture d’écran montrant la fenêtre Explorateur de solutions. L’option Ajouter est sélectionnée dans le menu Modèles avec le bouton droit et la classe est sélectionnée dans le sous-menu.

Nommez la classe « MovieInitializer ». Mettez à jour la MovieInitializer classe pour contenir le code suivant :

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

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.

Recherchez la Application_Start méthode et ajoutez un appel au Database.SetInitializer début de la méthode, comme indiqué ci-dessous :

Sub Application_Start()
        System.Data.Entity.Database.SetInitializer(Of MovieDBContext)(New MvcMovie.Models.MovieInitializer())
       
        AreaRegistration.RegisterAllAreas()

        RegisterGlobalFilters(GlobalFilters.Filters)
        RegisterRoutes(RouteTable.Routes)
    End Sub

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 :

7_MyMovieList_SM

Cliquez sur le lien Créer un nouveau film pour ajouter un nouveau film. Notez que vous pouvez ajouter une évaluation.

7_CreateRioII

Cliquez sur Créer. Le nouveau film, y compris l’évaluation, apparaît maintenant dans la liste des films :

7_ourNewMovie_SM

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.