• Aucun résultat trouvé

Ajout d'une propriété de notation pour le modèle de film

Commencez par ajouter une nouvelle propriété Rating à la classe existante Movie. Ouvrez le fichier Models\Movie.vb et ajouter la propriété Rating comme celui-ci :

Public Property Rating As String

Le code complet de la classe Movie ressemble maintenant au code suivant :

Public Class Movie

Public Property ID As Integer

Public Property Title As String <Display(Name:="Release Date")> <DataType(DataType.Date)>

<DisplayFormat(DataFormatString:="{0:yyyy-MM-dd}", ApplyFormatInEditMode:=True)>

Public Property ReleaseDate As DateTime

Public Property Genre As String

Public Property Price As Decimal Public Property Rating As String End Class

Générez l'application (Ctrl + Maj + B).

Parce que vous avez ajouté un nouveau champ à la classe Movie, vous devez également mettre à jour le Bind afin que cette nouvelle propriété sera incluse. Mettre à jour l'attribut Bind pour les méthodes d'action Create et Edit en incluant la propriété Rating :

<Bind(Include:="ID,Title,ReleaseDate,Genre,Price,Rating")>

Vous devez également mettre à jour les Templates de vue afin d'afficher, de créer et de modifier la nouvelle propriété Rating dans l'affichage du navigateur.

Ouvrez le fichier \Views\Movies\Index.vbhtml et ajouter un en-tête de colonne <th>Rating</th> juste après la colonne Price. Ajoutez ensuite une colonne <td> près de l'extrémité de

la Template pour restituer la valeur @item.Rating. Voici à quoi devrez ressemble la Template de mis à jour de Index.vbhtml:

@ModelType IEnumerable(Of MvcMovie.Models.Movie) @Code

ViewData("Title") = "Index" End Code

<h2>Index</h2> <p>

@Html.ActionLink("Create New", "Create")

@Using Html.BeginForm("Index", "Movies", FormMethod.Get) @<p>Genre: @Html.DropDownList("movieGenre", "All") Title: @Html.TextBox("SearchString") <br />

<input type="submit" value="Filter" /></p> End Using </p> <table class="table"> <tr> <th> @Html.DisplayNameFor(Function(model) model.Title) </th> <th> @Html.DisplayNameFor(Function(model) model.ReleaseDate) </th> <th> @Html.DisplayNameFor(Function(model) model.Genre) </th> <th> @Html.DisplayNameFor(Function(model) model.Price) </th> <th> @Html.DisplayNameFor(Function(model) model.Rating) </th> <th></th> </tr>

@For Each item In Model @<tr> <td> @Html.DisplayFor(Function(modelItem) item.Title) </td> <td> @Html.DisplayFor(Function(modelItem) item.ReleaseDate) </td> <td> @Html.DisplayFor(Function(modelItem) item.Genre) </td> <td> @Html.DisplayFor(Function(modelItem) item.Price) </td> <td> @Html.DisplayFor(Function(modelItem) item.Rating) </td> <td>

@Html.ActionLink("Edit", "Edit", New With {.id = item.ID }) |

@Html.ActionLink("Details", "Details", New With {.id = item.ID }) |

@Html.ActionLink("Delete", "Delete", New With {.id = item.ID })

</td> </tr> Next </table>

Ensuite, ouvrez le fichier \Views\Movies\Create.vbhtml et ajoutez le champ Rating en ajoutant le balisage suivant de met en évidence. Cela rend une zone de texte afin que vous pouvez spécifier un classement lorsqu'un nouveau film est créé.

<div class="form-group">

@Html.LabelFor(Function(model) model.Price, New With { .class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(Function(model) model.Price) @Html.ValidationMessageFor(Function(model) model.Price) </div> </div> <div class="form-group">

@Html.LabelFor(Function(model) model.Rating, New With {.class = "control-label col-md-2"})

<div class="col-md-10"> @Html.EditorFor(Function(model) model.Rating) @Html.ValidationMessageFor(Function(model) model.Rating) </div> </div> <div class="form-group">

<div class="col-md-offset-2 col-md-10">

<input type="submit" value="Create" class="btn btn-

default" />

</div>

</div>

Vous avez maintenant mis à jour le code de l'application pour prendre en charge la nouvelle propriété Rating.

Exécutez l'application et accédez à l'URL /Movies. Lorsque vous procédez ainsi, cependant, vous verrez une des erreurs suivantes :

Le modèle permettant la sauvegarde du contexte « MovieDBContext » a été modifié depuis la création de la base de données. Utiliser les Migrations Code First pour mettre à jour la base de données (http://go.microsoft.com/fwlink/?LinkId=238269).

Vous voyez cette erreur parce que la classe de modèle Movie mis à jour dans l'application est maintenant différente de celui du schéma de la table Movie de la base de données existante. (Il n'y a pas Rating de colonne dans la table de base de données.)

Il y a quelques approches pour résoudre l'erreur :

1. Autoriser l’Entity Framework automatiquement de supprimer et recréer la base de données basée avec le nouveau schéma de classe de modèle. Cette approche est très pratique au début du cycle de développement lorsque vous faites un développement actif sur une base de données de test ; il vous permet de faire évoluer rapidement l’ensemble du schéma de la base de données et du modèle. L'inconvénient, cependant, est que vous perdez les données existantes dans la base de données —vous ne voulez 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 qu'elle corresponde aux

classes du modèle. L'avantage de cette approche est que vous conservez vos données. Vous pouvez effectuer cette modification soit manuellement ou par la création d’un script de changement de la base de données.

3. Utiliser Les Migrations Code First afin de mettre à jour le schéma de la base de données. Pour ce tutoriel, nous allons utiliser les Migrations Code First.

Mettre à jour la méthode de Seed afin qu'il fournisse une valeur pour la nouvelle colonne. Ouvrir le fichier Migrations\Configuration.vb et ajoutez le champ Rating à chaque objet.

New Movie() With {

.Title = "When Harry Met Sally",

.ReleaseDate = Date.Parse("1989-1-11"), .Genre = "Romantic Comedy",

.Price = 7.99D, .Rating = "PG" }

Générez la solution, puis ouvrez la fenêtre de la Console du gestionnaire de Package et entrez la commande suivante :

La commande add-migration indique au Framework de la migration d'examiner le modèle actuel Movie en le comparant avec le schéma de BD Movies actuel et de créer le code nécessaire pour effectuer la migration de la BD selon le nouveau modèle. Le nom Rating est arbitraire et est utilisé pour nommer le fichier de migration. Il est utile d'utiliser un nom significatif pour chaque étape de la migration.

Lorsque cette commande se termine, Visual Studio ouvre le fichier de classe qui définit la nouvelle classe dérivée de la DbMigration en redéfinissant la méthode Up, vous pouvez voir le code qui crée la nouvelle colonne.

Public Partial Class Rating Inherits DbMigration

Public Overrides Sub Up()

AddColumn("dbo.Movies", "Rating", Function(c) c.String()) End Sub

Public Overrides Sub Down()

DropColumn("dbo.Movies", "Rating") End Sub

End Class

Générez la solution et puis entrez la commande update-database dans la fenêtre de la Console du gestionnaire de Package.

L'image suivante montre la sortie dans la fenêtre de Console du gestionnaire de Package (le cachet de date, ajout de note sera différent).

Relancez l'application et accédez à l'URL /Movies. Vous pouvez voir le nouveau champ Rating.

Cliquez sur le lien Create New pour ajouter un nouveau film. Notez que vous pouvez ajouter une note.

Cliquez sur créer. Le nouveau film, dont la valeur nominale, apparait désormais dans la liste des films :

Maintenant que le projet utilise les migrations, vous n'aurez pas besoin de supprimer la base de données lorsque vous ajoutez un nouveau champ ou autrement mettre à jour le schéma. Vous devez également ajouter le champ Rating pour les vues Edit, Detail et Delete.

Vous pouvez entrer la commande « update-database » dans la fenêtre de la Console du gestionnaire de paquet à nouveau et aucun code de migration ne serait exécuté, car le schéma correspond au modèle. Cependant, l’exécution de « update-database » exécutera la méthode Seed à nouveau, et si vous avez modifié les données de Seed, les modifications seront perdues parce que la de méthode Seed met à jours ou insert les données.

Dans cette section, vous avez vu comment vous pouvez modifier les objets de modèle et de maintenir la base de données en synchronisation avec les modifications. Vous avez appris aussi un moyen de remplir une base de données nouvellement créée avec des données d’exemple, alors vous pouvez essayer plusieurs scénarios. C'était juste une introduction rapide au premier Code.

Documents relatifs