Migrations Code First automatiques

Les migrations automatiques vous permettent d’utiliser les migrations Code First sans avoir de fichier de code dans votre projet pour chaque modification que vous apportez. Toutes les modifications ne peuvent pas être appliquées automatiquement : par exemple, les renommages de colonne nécessitent l’utilisation d’une migration basée sur du code.

Remarque

Cet article part du principe que vous savez comment utiliser les Migrations Code First dans des scénarios de base. Si ce n’est pas le cas, vous devez lire Migrations Code First avant de continuer.

Recommandation pour les environnements d’équipe

Vous pouvez entrecouper des migrations automatiques et basées sur du code, mais cela n’est pas recommandé dans les scénarios de développement d’équipe. Si vous faites partie d’une équipe de développeurs qui utilisent le contrôle de code source, vous devez utiliser des migrations purement automatiques ou des migrations purement basées sur du code. Étant donné les limitations des migrations automatiques, nous vous recommandons d’utiliser des migrations basées sur du code dans les environnements d’équipe.

Génération d’un modèle et d’une base de données initiaux

Avant de commencer à utiliser les migrations, nous avons besoin d’un projet et d’un modèle Code First. Pour cette procédure pas à pas nous utilisons le modèle canonique Blog et Post.

  • Créez une application console MigrationsAutomaticDemo
  • Ajoutez la dernière version du package NuGet EntityFramework au projet
    • Outils -> Gestionnaire de package de bibliothèque -> Console du Gestionnaire de package
    • Exécutez la commande Install-Package EntityFramework
  • Ajoutez un fichier Model.cs avec le code indiqué ci-dessous. Ce code définit une seule classe Blog qui constitue notre modèle de domaine et une classe BlogContext qui est notre contexte EF Code First
    using System.Data.Entity;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity.Infrastructure;

    namespace MigrationsAutomaticDemo
    {
        public class BlogContext : DbContext
        {
            public DbSet<Blog> Blogs { get; set; }
        }

        public class Blog
        {
            public int BlogId { get; set; }
            public string Name { get; set; }
        }
    }
  • Maintenant que nous avons un modèle, utilisons-le pour accéder aux données. Mettez à jour le fichier Program.cs avec le code indiqué ci-dessous.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MigrationsAutomaticDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var db = new BlogContext())
                {
                    db.Blogs.Add(new Blog { Name = "Another Blog " });
                    db.SaveChanges();

                    foreach (var blog in db.Blogs)
                    {
                        Console.WriteLine(blog.Name);
                    }
                }

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }
  • Exécutez votre application : une base de données MigrationsAutomaticCodeDemo.BlogContext est créée pour vous.

    Database LocalDB

Activation des migrations

Modifions un peu plus notre modèle.

  • Nous introduisons une propriété Url à la classe Blog.
    public string Url { get; set; }

Si vous réexécutez l’application, vous obtenez une exception InvalidOperationException indiquant Le modèle permettant la sauvegarde du contexte 'BlogContext' a changé depuis la création de la base de données. Envisagez d’utiliser Migrations Code First pour mettre la base de données à jour (http://go.microsoft.com/fwlink/?LinkId=238269).

Comme le suggère l’exception, utilisons donc Migrations Code First. Comme nous voulons utiliser des migrations automatiques, nous allons spécifier le commutateur –EnableAutomaticMigrations.

  • Exécutez la commande Enable-Migrations –EnableAutomaticMigrations dans la console du Gestionnaire de package. Cette commande a ajouté un dossier Migrations à notre projet. Ce nouveau dossier contient un fichier :

  • La classe Configuration. Cette classe vous permet de configurer le comportement des migrations pour votre contexte. Pour cette procédure pas à pas, nous utilisons simplement la configuration par défaut. Comme il n’y a qu’un seul contexte Code First dans votre projet, Enable-Migrations a automatiquement renseigné le type de contexte auquel s’applique cette configuration.

 

Première migration automatique

Migrations Code First a deux commandes principales que nous allons découvrir maintenant.

  • Add-Migration génère automatiquement la prochaine migration en fonction des changements de votre modèle depuis la création de la dernière migration
  • Update-Database applique toutes les migrations en attente à la base de données

Nous allons éviter d’utiliser Add-Migration (sauf si nous avons vraiment besoin de) et nous concentrer sur la façon de laisser les migrations Code First calculer et appliquer automatiquement les modifications. Utilisons Update-Database pour obtenir des migrations Code First pour envoyer (push) les modifications apportées à notre modèle (la nouvelle propriété Blog.Url) à la base de données.

  • Exécutez la commande Update-Database dans la Console du Gestionnaire de Package.

La base de données MigrationsAutomaticDemo.BlogContext est désormais mise à jour pour inclure la colonne Url dans la table Blogs.

 

Deuxième migration automatique

Nous allons apporter une autre modification et laisser Code First Migrations envoyer automatiquement les modifications à la base de données pour nous.

  • Ajoutons aussi une nouvelle classe Post
    public class Post
    {
        public int PostId { get; set; }
        [MaxLength(200)]
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
  • Nous allons aussi ajouter une collection Posts à la classe Blog pour former l’autre extrémité de la relation entre Blog et Post
    public virtual List<Post> Posts { get; set; }

Utilisez maintenant Update-Database pour mettre à jour la base de données. Cette fois, nous spécifions l’indicateur –Verbose pour pouvoir voir le code SQL que Migrations Code First exécute.

  • Exécutez la commande Update-Database –Verbose dans la Console du Gestionnaire de Package.

Ajout d’une migration basée sur du code

Examinons maintenant quelque chose pour lequel nous pourrions utiliser une migration basée sur le code.

  • Ajouter une propriété Rating à la classe Blog
    public int Rating { get; set; }

Nous pourrions simplement exécuter Update-Database pour envoyer ces modifications à la base de données. Cependant, nous ajoutons une colonne non-nullable Blogs.Rating. Si des données existent déjà dans la table, elles reçoivent le type de données CLR par défaut pour la nouvelle colonne (Rating est un entier, donc la valeur est 0). Toutefois, nous voulons spécifier une valeur par défaut égale à 3 pour que les lignes existantes de la table Blogs commencent avec un classement correct. Nous allons utiliser la commande Add-Migration pour écrire cette modification dans une migration basée sur du code afin de pouvoir la modifier. La commande Add-Migration permet de nommer ces migrations. Appelons la nôtre AddBlogRating.

  • Exécutez la commande Add-Migration AddBlogRating dans la Console du Gestionnaire de Package.
  • Dans le dossier Migrations, nous avons maintenant une nouvelle migration AddBlogRating. Le nom de fichier de la migration est préfixé avec un horodatage pour faciliter le classement. Nous allons modifier le code généré pour spécifier une valeur par défaut de 3 pour Blog.Rating (ligne 10 dans le code ci-dessous)

La migration a également un fichier code-behind qui capture certaines métadonnées. Ces métadonnées permettent aux migrations Code First de répliquer les migrations automatiques que nous avons effectuées avant cette migration basée sur le code. Cela est important si un autre développeur souhaite exécuter nos migrations ou quand il est temps de déployer notre application.

    namespace MigrationsAutomaticDemo.Migrations
    {
        using System;
        using System.Data.Entity.Migrations;

        public partial class AddBlogRating : DbMigration
        {
            public override void Up()
            {
                AddColumn("Blogs", "Rating", c => c.Int(nullable: false, defaultValue: 3));
            }

            public override void Down()
            {
                DropColumn("Blogs", "Rating");
            }
        }
    }

Notre migration modifiée est prête, utilisons Update-Database pour mettre à jour la base de données.

  • Exécutez la commande Update-Database dans la Console du Gestionnaire de Package.

Retour aux migrations automatiques

Nous sommes désormais libres de revenir aux migrations automatiques pour nos modifications plus simples. Les migrations Code First s’occupent de l’exécution des migrations automatiques et basées sur du code dans l’ordre correct en fonction des métadonnées qu’elle stocke dans le fichier code-behind pour chaque migration basée sur le code.

  • Ajoutons une propriété Post.Abstract à notre modèle
    public string Abstract { get; set; }

Nous pouvons maintenant utiliser Update-Database pour obtenir des migrations Code First pour envoyer cette modification à la base de données à l’aide d’une migration automatique.

  • Exécutez la commande Update-Database dans la Console du Gestionnaire de Package.

Résumé

Dans cette procédure pas à pas, vous avez vu comment utiliser des migrations automatiques pour envoyer des modifications de modèle à la base de données. Vous avez également vu comment générer et exécuter des migrations basées sur du code entre les migrations automatiques lorsque vous avez besoin d’un contrôle supplémentaire.