Aller au contenu principal

5-8 Exécuter les migrations

Il y a quelques façons d'exécuter les migrations. La principale, et méthode recommandée par FluentMigrator, est de les exécuter à même l'application.

Notre objectif sera donc de: lors du lancement de l'application, exécuter les migrations (s'il y en a des nouvelles).

Configuration du ConnectionString

Pour que FluentMigrator puisse exécuter les migrations, il doit être en mesure de se connecter à la base de données.

info

En .NET, ce qu'on appelle ConnectionString est une string identifiant les informations de connexion à la base de données.

On configure cette dernière dans appsettings.json.

Il est important de noter que plusieurs versions de appsettings.json peuvent exister. En effet, les informations de connexion de la base de données en développement vs celles de production (live) ne sont pas les mêmes.

Nous utiliserons appsettings.Development.json pour le développement. .NET s'occupe de récupérer le bon fichier en fonction de l'environnement.

Ajoutez le bloc ConnectionStrings dans votre fichier et assurez-vous de modifier les paramètres en fonction de vos configurations personnelles:

  • Database: le nom de votre BD créée précédemment pour Snowfall
  • User Id: le nom d'utilisateur de la BD
  • Password: le mot de passe pour accéder à la BD
Snowfall.Web.Mvc/appsettings.Development.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"AppDatabaseConnection" : "Server=localhost;Database=snowfall;User Id=postgres;Password=admin;Include Error Detail=true;"
}
}

Configuration de FluentMigrator

  1. Créer dossier Configurations. Dans le projet Snowfall.Data, créez un dossier Configurations
  2. Classe MigrationsConfig. Dans le dossier Snowfall.Data/Configurations, creez une classe MigrationsConfig. La structure devrait ressembler à ceci: Imgur
  3. Mettez le code suivant dans la classe MigrationsConfig:
Snowfall.Data/Configurations/MigrationsConfig.cs
using System.Reflection;
using FluentMigrator.Runner;
using Microsoft.Extensions.DependencyInjection;

namespace Snowfall.Data.Configurations;

public static class MigrationsConfig
{
/// <summary>
/// Enregistre FluentMigrator à la collection de services
/// </summary>
public static IServiceCollection AddMigrations(this IServiceCollection services, string connectionString)
{
if (services == null)
throw new ArgumentNullException(nameof(services));

// Configure le service FluentMigrator
services.AddFluentMigratorCore()
.ConfigureRunner(c => c
.AddPostgres()
.WithGlobalConnectionString(connectionString)
.ScanIn(Assembly.GetExecutingAssembly()).For.All()
);

// Ajoute le logging en console
services.AddLogging(c => c.AddFluentMigratorConsole());

return services;
}

/// <summary>
/// Exécute les migrations "Up"
/// </summary>
public static void MigrateUp(this IServiceProvider serviceProvider)
{
using var scope = serviceProvider.CreateScope();
var migrationRunner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();
migrationRunner.MigrateUp();
}

/// <summary>
/// Exécute les migrations "Down"
/// </summary>
public static void MigrateDown(this IServiceProvider serviceProvider, long version = 0)
{
using var scope = serviceProvider.CreateScope();
var migrationRunner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();
migrationRunner.MigrateDown(version);
}
}
info

Nous reviendrons plus en détail sur cette classe, ce qu'elle fait et les différents aspects de cette dernière.

Pour l'instant, on se contentera de l'ajouter sachant qu'elle est responsable d'effectuer la configuration de FluentMigrator.

Exécuter les migrations au lancement de l'application

Finalement, la dernière étape est d'exécuter les migrations lors du lancement de l'application.

Pour ce faire, dans Program.cs, ajoutez les trois lignes en surbrillance:

Snowfall.Web.Mvc/Program.cs
using Snowfall.Data.Configurations;

var builder = WebApplication.CreateBuilder(args);
var configuration = builder.Configuration;

// Add services to the container.
builder.Services.AddControllersWithViews();

// Ajoute les migrations
builder.Services.AddMigrations(configuration.GetConnectionString("AppDatabaseConnection")!);

var app = builder.Build();

app.Services.MigrateUp();

//...

Lancer l'application

Essayez maintenant de lancer l'application. La migration devrait s'exécuter et vous devriez voir dans la console debug le détail: Imgur

-------------------------------------------------------------------------------
202501310929: CreerVilles migrating
-------------------------------------------------------------------------------


CREATE TABLE "public"."villes" ("id" bigserial NOT NULL, "nom" text NOT NULL, "pays_iso" varchar(2) NOT NULL, CONSTRAINT "PK_villes" PRIMARY KEY ("id"));

INSERT INTO "public"."VersionInfo" ("Version","AppliedOn","Description") VALUES (202301311649,'2023-02-01T19:54:01','CreerVilles');

Vérification dans DataGrip

Allez dans DataGrip pour voir le résultat.

Si vous voyez No schemas selected...

  1. Appuyez sur les trois petits points (...)
    Imgur
  2. Sélectionnez au minimum public
    Imgur
  3. Magie
    Imgur

Utiliser l'intégration BD de Rider

À noter que vous pouvez vous connecter à votre base de données directement à partir de Rider.

En effet, il détecte que vous avez configuré une Connection String et utilisera cette information pour se connecter à votre base de données.

img

img