Migrations Code First automatique

Les migrations automatiques vous permettent d’utiliser 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 suppose que vous savez utiliser 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 intersperser 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.

Création d’une base de données de modèle & initiale

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éer 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 et vous verrez qu’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 deviez réexécuter l’application, vous obtiendrez une invalidOperationException indiquant que le modèle qui sauvegarde le contexte « BlogContext » a changé depuis la création de la base de données. Envisagez d’utiliser Migrations Code First pour mettre à jour la base de données (http://go.microsoft.com/fwlink/?LinkId=238269).

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

  • Exécutez la commande Enable-Migrations –EnableAutomaticMigrations dans Gestionnaire de package console 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.

 

Votre 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 devons vraiment) et nous concentrer sur l’utilisation de Migrations Code First calculer et appliquer automatiquement les modifications. Utilisons Update-Database pour obtenir Migrations Code First pour envoyer les modifications à notre modèle (la nouvelle propriété Blog.Url) vers la base de données.

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

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

 

Votre deuxième migration automatique

Nous allons apporter une autre modification et laisser Migrations Code First 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 le code

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

  • Ajout d’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. Toutefois, nous ajoutons une colonne Blogs.Rating non nullable, s’il existe des données existantes dans la table, elle obtient la valeur clR par défaut du type de données pour la nouvelle colonne (Rating est entier, ce qui serait 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. Utilisons 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 nous permet de donner à ces migrations un nom, nous allons simplement appeler notre AddBlogRating.

  • Exécutez la commande AddBlogRating AddBlogRating dans Gestionnaire de package console.
  • Dans le dossier Migrations , nous avons maintenant une nouvelle migration AddBlogRating . Le nom de fichier de migration est prédéfini avec un horodatage pour faciliter l’ordre. 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 comporte également un fichier code-behind qui capture certaines métadonnées. Ces métadonnées permettent 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 Gestionnaire de package Console.

Retour aux migrations automatiques

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

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

Maintenant, nous pouvons utiliser Update-Database pour obtenir 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 Gestionnaire de package Console.

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 créer et exécuter des migrations basées sur du code entre les migrations automatiques lorsque vous avez besoin d’un contrôle supplémentaire.