• Aucun résultat trouvé

Mise en place les premières Migrations Code pour modéliser les changements

Accédez à l'Explorateur de solutions. Faites un clic droit sur le fichier Movies.mdf et sélectionnez supprimer pour supprimer la base de données de films. Si vous ne voyez pas le fichier Movies.mdf, cliquez sur l'icône Afficher tous les fichiers ci-dessous dans le contour rouge.

Générez l'application pour s'assurer qu'il n'y a pas d'erreurs.

Dans le menu Outils, cliquez sur Gestionnaire de Package NuGet, puis sur Console du gestionnaire de Package.

Dans la fenêtre de la Console du gestionnaire de Package à la PM> invite entrer Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbContext

La commande Enable-Migrations (illustrée ci-dessus) crée un fichier Configuration.vb dans un nouveau dossier de Migrations.

Visual Studio ouvre le fichier Configuration.vb. Remplacez la méthode Seed dans le fichier Configuration.vb avec le code suivant :

Protected Overrides Sub Seed(context As MovieDbContext) context.Movies.AddOrUpdate(Function(i) i.Title, New Movie() With {

.Title = "When Harry Met Sally",

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

.Price = 7.99D }, New Movie() With {

.Title = "Ghostbusters ",

.ReleaseDate = Date.Parse("1984-3-13"), .Genre = "Comedy",

.Price = 8.99D }, New Movie() With {

.Title = "Ghostbusters 2",

.ReleaseDate = Date.Parse("1986-2-23"), .Genre = "Comedy",

}, New Movie() With { .Title = "Rio Bravo",

.ReleaseDate = Date.Parse("1959-4-15"), .Genre = "Western",

.Price = 3.99D })

End Sub

Faites un clic droit sur le trait rouge sinueux sous Movie et sélectionnez l’icône de la lampe, puis cliquez sur Imports MvcMovie.Models ;

Cela ajoute ce qui suit à l'aide de la déclaration : Imports MvcMovie.Models

Les Migrations code First appelle la méthode de Seed après chaque migration (c'est-à-dire appelant la mise à jour de base de données dans la Console du gestionnaire de Package) et cette méthode met à jour les lignes qui ont déjà été insérés ou insère si elles n'existent pas encore.

La méthode AddOrUpdate dans le code suivant effectue une opération de "upsert" : context.Movies.AddOrUpdate(Function(i) i.Title,

New Movie() With {

.Title = "When Harry Met Sally",

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

.Price = 7.99D }

Parce que la méthode Seed s'exécute avec chaque migration, vous ne pouvez pas juste d'insérer les données, parce que les lignes que vous voulez ajouter sera déjà là après la première migration qui a créé la base de données. L'opération "upsert" évite les erreurs qui se passerait si vous essayez d'insérer une ligne qui existe déjà, mais elle écrase tout changement des données que vous pouvez faire pendant que vous testez l'application. Avec les données de test dans certaines tables, dans certains cas lorsque vous modifiez des données lors du test vous souhaitez que vos modifications persistent après les mises à jour de base de données. Dans ce cas, vous voulez faire une opération d'insertion conditionnelle : insérer une ligne uniquement s’il n'existe pas déjà.

Le premier paramètre à passer à la méthode AddOrUpdate, spécifie la propriété à utiliser pour vérifier si une ligne existe déjà. Pour les données de test que vous avez fourni, la propriété Title peut servir à cet effet puisque chaque titre dans la liste est unique :

Ce code suppose que les titres soient uniques. Si vous ajoutez manuellement un titre en double, vous obtiendrez l'exception suivante la prochaine fois que vous effectuez une migration.

Sequence contains more than one element

Appuyez sur CTRL-MAJ-B pour générer le projet. (Les étapes suivantes échouera si vous ne générer pas à ce stade).

L'étape suivante consiste à créer une classe DbMigration pour la migration initiale. Cette migration crée une nouvelle base de données, c'est pourquoi vous avez supprimé le fichier movie.mdf dans une étape précédente.

Dans la fenêtre de la Console du gestionnaire de Package, entrez la commande add-migration Initial pour créer la migration initiale. Le nom « Initial » est arbitraire et est utilisé pour nommer le fichier de migration créé.

Les Migrations code First crée une autre classe dans le dossier des Migrations (avec le nom {DateStamp}_Initial.vb, et cette classe contient du code qui crée le schéma de base de données. Le nom de fichier de migration est préalablement fixé avec un horodatage pour aider à la commande. Examiner la {DateStamp}_Initial.vb fichier, il contient les instructions pour créer la table Movies pour la base de données Movies. Lorsque vous mettez à jour la base de données dans les directives qui suivent, le fichier {DateStamp}_Initial.vb s’exécute et crée le schéma. Puis la méthode Seed s'exécutera pour remplir la BD avec les données de test.

Dans la Console du gestionnaire de Package, entrez la commande update-database pour créer la base de données et exécuter la méthode Seed.

Si vous obtenez une erreur indiquant qu’une table existe déjà et elle ne peut pas être créée, c'est probablement parce que vous avez exécuté l'application une fois que vous avez supprimé la base de données et avant que vous exécutiez update-database. Dans ce cas, supprimez le fichier Movies.mdf à nouveau et réessayez la commande update-database. Si vous obtenez toujours une erreur, supprimez le dossier migrations et son contenu puis commencez par les instructions en haut de cette page (supprimer le fichier Movies.mdf, puis passez à Enable-Migrations).

Exécutez l'application et accédez à l'URL /Movies. Les données de la méthode Seed sont affichées.

Documents relatifs