Aller au contenu principal

Mise à jour de la base de données

Lagoon s'appuie sur Entity Framework Core en approche CodeFirst : le modèle C# décrit la structure attendue, puis EF Core génère des migrations pour faire évoluer le schéma de base de données.

DbContext applicatif​

Le contexte EF Core de l'application est généralement nommé ApplicationDbContext et se trouve dans le projet Model. Dans la solution de démonstration, il est placé sous Apps\Demo\Model\Context\ApplicationDbContext.cs.

Le choix de la classe de base dépend du type de clé et du besoin de suivi des modifications :

Classe de baseUsage
LgApplicationDbContext<TUser>Contexte avec clés string.
LgApplicationDbContextGuid<TUser>Contexte avec clés Guid.
LgApplicationTrackedChangeDbContext<TUser>Contexte avec clés string et audit trail.
LgApplicationTrackedChangeDbContextGuid<TUser>Contexte avec clés Guid et audit trail.

La démonstration utilise LgApplicationDbContextGuid<ApplicationUser>. Le DbContext configure le fournisseur EF Core, l'assembly des migrations, OpenIddict, les règles Identity, les rôles et les conventions de dates.

Créer une migration​

Une migration capture l'évolution du modèle EF Core. Pour la première livraison, l'ancienne documentation utilise le nom InitialCreate :

dotnet ef migrations add InitialCreate

Pour les livraisons suivantes, créez une nouvelle migration avec un nom descriptif :

dotnet ef migrations add <Nom>

Les conventions Lagoon demandent des noms de classes en PascalCase, par exemple Init, AddTableTrackedChanges ou LastLoginDate. La solution de démonstration contient une migration réelle nommée Init, générée dans Apps\Demo\Model\Migrations\20230412074341_Init.cs.

Les migrations sont placées sous Apps\*\Model\Migrations\. Le snapshot EF Core généré s'appelle ApplicationDbContextModelSnapshot.cs.

Pour cibler explicitement les projets EF Core, utilisez le projet Model et le projet de démarrage Server :

dotnet ef migrations add <Nom> --project Model\APP.Model.csproj --startup-project Server\APP.Server.csproj

Appliquer en développement​

En développement, appliquez les migrations avec :

dotnet ef database update

Avec des projets explicitement ciblés :

dotnet ef database update --project Model\APP.Model.csproj --startup-project Server\APP.Server.csproj

Mise à jour au démarrage de l'application​

Par défaut, la base de données se met à jour automatiquement au démarrage de l'application. Lorsque la configuration le permet, la classe Main serveur appelle UpdateDatabaseAsync avant son appel à la méthode OnStartAsync. Cette méthode applique les migrations en attente puis appelle OnUpdateDatabaseAsync.

OnUpdateDatabaseAsync sert à initialiser les données. Dans la démonstration, il appelle DataSeeder.SeedAsync(...) puis FakeDataSeeder.SeedAsync(...) en développement.

protected virtual async Task InternalStartAsync(IServiceProvider scopedServiceProvider, CancellationToken cancellationToken)
{
if (Configuration.GetValue("Lagoon:AutoUpdateDatabase", true))
{
// Applique les migrations en attente puis déclenche OnUpdateDatabaseAsync.
await UpdateDatabaseAsync(scopedServiceProvider, cancellationToken);
}
}

Cette mise à jour automatique peut être désactivée depuis appsettings.json en positionnant Lagoon:AutoUpdateDatabase à false :

{
"Lagoon": {
"AutoUpdateDatabase": false
}
}
Plusieurs instances en parallèle

Désactivez Lagoon:AutoUpdateDatabase dès que plusieurs instances de l'application démarrent en parallèle (répartition de charge, plusieurs conteneurs, …). Sans cette précaution, chaque instance tenterait d'appliquer les migrations en même temps au démarrage.

Préparer une mise à jour de production​

Plusieurs modes de mise à jour de la base de données sont disponibles pour la production :

ModeDescription
Automatique au démarrageComportement par défaut, voir ci-dessus.
Ligne de commandeExécution de la commande updateDB depuis le serveur, sans redémarrer l'application.
Script SQLScript généré à l'avance et exécuté manuellement, selon le processus d'exploitation de votre environnement.

Ligne de commande​

L'application Batch de la solution déclare la commande updateDB (voir Applications console Lagoon). Depuis le serveur, exécutez :

monapp updateDB

Cette commande applique les migrations en attente sans démarrer le serveur web, ce qui permet de préparer la base de données avant ou indépendamment du déploiement.

Script SQL généré à l'avance​

Pour une base de données de production, générez un script SQL à partir des migrations :

dotnet ef migrations script

Faites valider et exécuter ce script selon le processus d'exploitation de votre environnement (par exemple par une équipe DBA n'ayant pas accès au SDK .NET).

Documentation EF Core​