Vue d’ensemble des migrationsMigrations Overview

Dans la pratique, les modèles de données des projets évoluent au fur et à mesure que des fonctionnalités sont implémentées : de nouvelles entités et propriétés sont ajoutées et supprimées, et les schémas de la base de données doivent être modifiés en conséquence pour rester synchronisés avec l’application.In real world projects, data models change as features get implemented: new entities or properties are added and removed, and database schemas needs to be changed accordingly to be kept in sync with the application. La fonctionnalité de migration dans EF Core permet de mettre à jour de manière incrémentielle le schéma de la base de données pour qu’il reste synchronisé avec le modèle de données de l’application tout en conservant les données existantes dans la base de données.The migrations feature in EF Core provides a way to incrementally update the database schema to keep it in sync with the application's data model while preserving existing data in the database.

Dans les grandes lignes, les migrations fonctionnent de la façon suivante :At a high level, migrations function in the following way:

  • Lors de l’introduction d’une modification du modèle de données, le développeur utilise des outils EF Core afin d’ajouter une migration correspondante décrivant les mises à jour nécessaires pour préserver la synchronisation du schéma de la base de données. EF Core compare le modèle actuel à un instantané de l’ancien modèle pour déterminer les différences et génère des fichiers sources de migration. Ces fichiers peuvent, comme n’importe quel fichier source, faire l’objet d’un suivi dans le contrôle de code source du projet.When a data model change is introduced, the developer uses EF Core tools to add a corresponding migration describing the updates necessary to keep the database schema in sync. EF Core compares the current model against a snapshot of the old model to determine the differences, and generates migration source files; the files can be tracked in your project's source control like any other source file.
  • Une fois générée, la nouvelle migration peut être appliquée à une base de données de différentes façons.Once a new migration has been generated, it can be applied to a database in various ways. EF Core enregistre toutes les migrations appliquées dans une table d’historique spéciale, ce qui lui permet de savoir quelles migrations ont été appliquées.EF Core records all applied migrations in a special history table, allowing it to know which migrations have been applied and which haven't.

La suite de cette page est un guide pas à pas d’utilisation des migrations à destination des débutants.The rest of this page is a step-by-step beginner's guide for using migrations. Pour plus d’informations, consultez les autres pages de cette section .Consult the other pages in this section for more in-depth information.

Prise en mainGetting started

Supposons que vous venez de terminer votre première application EF Core, qui contient le modèle simple suivant :Let's assume you've just completed your first EF Core application, which contains the following simple model:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Pendant le développement, vous avez peut-être utilisé les API de création et de suppression pour effectuer des itérations rapides, en modifiant votre modèle selon les besoins. Cependant, maintenant que votre application est sur le point de passer en production, il vous faut un moyen de faire évoluer le schéma de manière sécurisée sans supprimer l’intégralité de la base de données.During development, you may have used the Create and Drop APIs to iterate quickly, changing your model as needed; but now that your application is going to production, you need a way to safely evolve the schema without dropping the entire database.

Installer les outilsInstall the tools

Tout d’abord, vous devez installer les outils en ligne de commande EF Core :First, you'll have to install the EF Core command-line tools:

Première création d’une migrationCreate your first migration

Il est temps d’ajouter votre première migration.You're now ready to add your first migration! Demandez à EF Core de créer une migration nommée InitialCreate :Instruct EF Core to create a migration named InitialCreate:

dotnet ef migrations add InitialCreate

EF Core créera un répertoire nommé Migrations dans votre projet et générera des fichiers.EF Core will create a directory called Migrations in your project, and generate some files. Il est judicieux d’inspecter précisément les fichiers en question, et éventuellement de les modifier, mais nous allons nous en passer pour l’instant.It's a good idea to inspect what exactly EF Core generated - and possibly amend it - but we'll skip over that for now.

Création d’une base de données et d’un schémaCreate your database and schema

Vous pouvez maintenant demander à EF de créer votre base de données et votre schéma à partir de la migration,At this point you can have EF create your database and create your schema from the migration. par différents moyens :This can be done via the following:

dotnet ef database update

Votre application est prête à s’exécuter sur votre nouvelle base de données, sans que vous ayez eu à écrire une seule ligne de code SQL.That's all there is to it - your application is ready to run on your new database, and you didn't need to write a single line of SQL. Sachez que cette méthode d’application des migrations, idéale pour le développement local, est moins adaptée aux environnements de production. Pour plus d’informations, consultez la page Application des migrations.Note that this way of applying migrations is ideal for local development, but is less suitable for production environments - see the Applying Migrations page for more info.

Évolution du modèleEvolving your model

Au bout de quelques jours, il vous est demandé d’ajouter un timestamp de création à vos blogs.A few days have passed, and you're asked to add a creation timestamp to your blogs. Vous avez apporté les modifications nécessaires à votre application. Votre modèle se présente maintenant ainsi :You've done the necessary changes to your application, and your model now looks like this:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedTimestamp { get; set; }
}

Votre modèle et votre base de données de production ne sont plus synchronisés. Vous devez donc ajouter une nouvelle colonne au schéma de votre base de données.Your model and your production database are now out of sync - we must add a new column to your database schema. Créons pour cela une nouvelle migration :Let's create a new migration for this:

dotnet ef migrations add AddBlogCreatedTimestamp

Comme vous pouvez le constater, nous donnons aux migrations un nom descriptif pour faciliter par la suite la compréhension de l’historique du projet.Note that we give migrations a descriptive name, to make it easier to understand the project history later.

Comme il ne s’agit pas de la première migration du projet, EF Core compare maintenant votre modèle mis à jour à un instantané de l’ancien modèle avant ajout de la colonne, à savoir l’un des fichiers générés par EF Core à l’ajout d’une migration, archivé dans le contrôle de code source.Since this isn't the project's first migration, EF Core now compares your updated model against a snapshot of the old model, before the column was added; the model snapshot is one of the files generated by EF Core when you add a migration, and is checked into source control. Sur la base de cette comparaison, EF Core détecte qu’une colonne a été ajoutée et ajoute la migration correspondante.Based on that comparison, EF Core detects that a column has been added, and adds the appropriate migration.

Vous pouvez maintenant appliquer votre migration comme tout à l’heure :You can now apply your migration as before:

dotnet ef database update

Cette fois, EF détecte que la base de données existe déjà.Note that this time, EF detects that the database already exists. Par ailleurs, lors de l’application de la première migration, ce fait a été enregistré dans une table d’historique des migrations spéciale de la base de données. Ainsi, EF peut appliquer automatiquement la nouvelle migration uniquement.In addition, when our first migration was applied above, this fact was recorded in a special migrations history table in your database; this allows EF to automatically apply only the new migration.

Exclusion de parties de votre modèleExcluding parts of your model

Notes

Cette fonctionnalité a été introduite EF dans Core 5,0.This feature was introduced EF in Core 5.0.

Parfois, vous pouvez faire référence à des types à partir d’un autre DbContext.Sometimes you may want to reference types from another DbContext. Cela peut entraîner des conflits de migration.This can lead to migration conflicts. Pour éviter cela, excluez le type des migrations de l’un des DbContexts.To prevent this, exclude the type from the migrations of one of the DbContexts.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUser>()
        .ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}

Étapes suivantesNext steps

Cette page ne constitue qu’une courte initiation aux migrations.The above was only a brief introduction to migrations. Pour plus d’informations sur la gestion des migrations, leur application et d’autres aspects, consultez les autres pages de la documentation.Please consult the other documentation pages to learn more about managing migrations, applying them, and other aspects. La référence de l’outil CLI .NET Core contient également des informations utiles sur les différentes commandes.The .NET Core CLI tool reference also contains useful information on the different commands

Ressources supplémentairesAdditional resources