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 base | Usage |
|---|---|
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
}
}
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 :
| Mode | Description |
|---|---|
| Automatique au démarrage | Comportement par défaut, voir ci-dessus. |
| Ligne de commande | Exécution de la commande updateDB depuis le serveur, sans redémarrer l'application. |
| Script SQL | Script 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).