Une des nouveautés les plus intéressantes qu’apporte Entity Framework 4.3.1 est la migration pour les mises à jour de la base de données.
Précédemment, avec Code First, si vous vouliez apporter une modification (ajout d’une colonne par exemple) à une table de votre base de données, si vous vous limitiez à définir uniquement la nouvelle colonne dans votre modèle, lors de l’exécution de l’application vous obteniez un message d’erreur puisque le modèle ne correspond plus aux objets de la BD.
En apportant les modifications du côté de la base de données, il fallait de nouveau mettre à jour le modèle. Cette action avait pour conséquence de régénérer à nouveau le modèle, avec éventuellement la perte de la personnalisation (message d’erreur de validation, définition des attributs Display, etc.) que vous aviez effectué dans votre modèle.
Avec la migration de base de données introduite par la version 4.3.1 d’Entity Framework, des modifications peuvent être apportées facilement et aisément à la base de données à partir du modèle.
Assez de charabia. Voyons concrètement de quoi il s’agit en touchant cette nouveauté « du bout du doigt ».
Créez une nouvelle application ASP.NET MVC 4 « DataMigration » en utilisant le modèle Internet Application. Avec NuGet, vous allez faire une mise à jour d’Entity Framework vers la dernière version de la bibliothèque qui ajoute les fonctionnalités de migration des bases de données.
Vous devez maintenant ajouter une nouvelle classe « Customer » dans le modèle représentant un client. Le code de cette classe est le suivant :
public class Customer { public short Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
Vous allez par la suite créer un nouveau contrôleur en utilisant Entity Framework pour les actions CRUD.
Dans les options de scalffolding, vous devez sélectionner la classe Customer. Dans la zone Data context class, vous allez sélectionner « New data context…>. Renseignez le nom du Data Context « DataMigrationContext », validez ensuite sur OK et cliquez enfin sur Ajouter.
Un fichier DataMigrationContext.cs sera automatiquement ajouté à l’application.
Exécutez l’application pour que Code First utilise le modèle pour créer la base de données qui sera automatiquement ajoutée à votre instance SQLEXPRESS locale.
Activation de la migration
Supposons que vous avez oublié une propriété Email dans votre modèle. Vous allez donc modifier celui-ci en ajoutant cette nouvelle propriété :
public class Customer { public short Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string EMail { get; set; } }
Si vous exécutez votre application ainsi, vous allez obtenir le message d’erreur suivant :
Comme l’exception le signale, il est temps pour vous d’utiliser Code First Migrations pour procéder à la mise à jour de votre base de données.
La première étape est d’activer la migration pour votre Context, en utilisant la console du gestionnaire de packages. Vous allez exécuter la commande suivante : Enabled-Migrations.
L’activation de la migration crée un nouveau dossier Migrations dans votre application contenant un fichier Configurations.cs permettant de définir le comportement de la migration pour le Context, et un autre fichier contenant une procédure Up() qui contient des instructions pour créer la table avec la définition initiale de celle-ci, et une autre procédure Down pour supprimer la table.
public partial class InitialCreate : DbMigration { public override void Up() { CreateTable( "Customers", c => new { Id = c.Short(nullable: false, identity: true), FirstName = c.String(), LastName = c.String(), }) .PrimaryKey(t => t.Id); } public override void Down() { DropTable("Customers"); } }
Ajout d’une nouvelle migration
Vous allez maintenant ajouter une nouvelle migration pour prendre en compte le nouvel attribut dans la base de données. Vous allez utiliser la commande Add-Migration suivie du nom de la migration :
Un nouveau fichier 201203082156197_FirstMigration.cs sera automatiquement ajouté au dossier Migrations :
Ce fichier contient par défaut le code suivant :
namespace DataMigration.Migrations { using System.Data.Entity.Migrations; public partial class FirstMigration : DbMigration { public override void Up() { AddColumn("Customers", "EMail", c => c.String()); } public override void Down() { DropColumn("Customers", "EMail"); } } }
Vous pouvez apporter des modifications à ce fichier en ajoutant ou supprimant de nouvelles colonnes. Lorsque tout est Ok, vous pouvez utiliser la commande Update-Database pour appliquer cette migration sur la base de données.
Vous pouvez observer les modifications qui ont été apportées à la base de données dans l’explorateur de serveur:
Et voilà , vous venez grâce à Code First Migrations d’apporter les modifications qui ont été effectuées du côté du code de votre application à la base de données.