Migrations de bases de données en C# (.NET) : Entity Framework Migrations

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Migrations de bases de données en C# (.NET) avec Entity Framework

\n\n

Lors du développement d'applications en C# (.NET), l'une des tâches clés est la synchronisation du modèle de données (classes C#) et du schéma de la base de données. Modifier manuellement les tables, colonnes et relations est un processus laborieux et sujet aux erreurs. La solution à ce problème réside dans les migrations de bases de données, un mécanisme intégré d'Entity Framework (EF) Core ou d'Entity Framework 6. Les migrations permettent d'appliquer automatiquement les modifications à la structure de la BD en fonction des changements dans le code, tout en préservant les données existantes.

\n\n

Que sont les migrations et pourquoi en a-t-on besoin ?

\n\n

Une migration est un ensemble d'instructions (code en C#) décrivant comment modifier le schéma de la base de données d'une version à une autre. Au lieu d'écrire manuellement des scripts SQL, le développeur modifie les modèles C# (par exemple, en ajoutant une nouvelle propriété à une classe), et EF génère un fichier de migration. Ce fichier est ensuite appliqué à la base de données.

\n\n
    \n
  • Automatisation : Élimine l'écriture manuelle de SQL.
  • \n
  • Versionnement : Chaque migration est un fichier distinct avec un horodatage, permettant de revenir en arrière.
  • \n
  • Sécurité des données : Lors de l'ajout d'une colonne, EF ne supprime pas les lignes existantes (sauf indication contraire).
  • \n
  • Travail collaboratif : Tous les membres de l'équipe appliquent les mêmes migrations, ce qui évite les divergences de schéma.
  • \n
\n\n

Préparation du projet

\n\n

Pour travailler avec les migrations, le package Microsoft.EntityFrameworkCore.Tools (pour EF Core) ou EntityFramework (pour EF6) doit être installé. Installation via NuGet :

\n\n
// Pour EF Core (via Package Manager Console)\nInstall-Package Microsoft.EntityFrameworkCore.Tools\n\n// Ou via .NET CLI\ndotnet add package Microsoft.EntityFrameworkCore.Tools\n
\n\n

Un contexte de base de données héritant de DbContext est également nécessaire. Exemple de modèle simple :

\n\n
public class Blog\n{\n    public int Id { get; set; }\n    public string Title { get; set; }\n    public string Content { get; set; }\n}\n\npublic class AppDbContext : DbContext\n{\n    public DbSet<Blog> Blogs { get; set; }\n\n    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\n    {\n        optionsBuilder.UseSqlServer("Server=(localdb)\\\\mssqllocaldb;Database=MyBlogDb;Trusted_Connection=True;");\n    }\n}\n
\n\n

Création de la première migration

\n\n

Ouvrez la Package Manager Console (dans Visual Studio : View -> Other Windows -> Package Manager Console) ou utilisez .NET CLI. Exécutez la commande :

\n\n
// Via PMC\nAdd-Migration InitialCreate\n\n// Ou via CLI\ndotnet ef migrations add InitialCreate\n
\n\n

Après exécution, un dossier Migrations apparaît dans le projet avec deux fichiers :

\n
    \n
  • XXXXXXXXXXXXXX_InitialCreate.cs — la classe de migration avec les méthodes Up() (quoi modifier) et Down() (comment annuler).
  • \n
  • AppDbContextModelSnapshot.cs — un instantané du modèle actuel.
  • \n
\n\n

Application de la migration à la base de données

\n\n

Pour créer ou mettre à jour la BD vers la dernière version, exécutez :

\n\n
// Via PMC\nUpdate-Database\n\n// Via CLI\ndotnet ef database update\n
\n\n

EF exécutera toutes les migrations non appliquées dans l'ordre. Si la base de données n'existe pas, elle sera créée automatiquement.

\n\n

Ajout d'un nouveau champ et création d'une migration

\n\n

Supposons que nous décidions d'ajouter la propriété CreatedAt au modèle Blog :

\n\n
public class Blog\n{\n    public int Id { get; set; }\n    public string Title { get; set; }\n    public string Content { get; set; }\n    public DateTime CreatedAt { get; set; } // nouveau champ\n}\n
\n\n

Créons maintenant une nouvelle migration :

\n\n
Add-Migration                    

Recommendations