Écrire une migration n'a plus à ouvrir la base de développement
`dotnet ef` exécute `Program.cs` pour retrouver les services — or `Program.cs` appelle `Database.Migrate()` au démarrage. Générer une migration supposait donc d'ouvrir la base de développement : au mieux inutile, au pire bloquant. Constaté sur un système de fichiers réseau, où le verrou SQLite ne se prend jamais : l'outil attendait cinq minutes, renonçait, et laissait derrière lui un processus qui verrouillait les binaires. Une fabrique de conception coupe court : produire une migration n'ouvre aucune base, et sa chaîne de connexion ne sert qu'à la génération du code. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,33 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Design;
|
||||||
|
|
||||||
|
namespace MaBibli.Api.Data;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fabrique le <see cref="MaBibliDbContext"/> pour les <b>outils</b> (<c>dotnet ef</c>), sans
|
||||||
|
/// démarrer l'application.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Sans elle, <c>dotnet ef</c> exécute <c>Program.cs</c> pour retrouver les services — et
|
||||||
|
/// <c>Program.cs</c> appelle <c>Database.Migrate()</c> au démarrage. Écrire une migration
|
||||||
|
/// suppose alors d'ouvrir la base de développement, ce qui est au mieux inutile et au pire
|
||||||
|
/// bloquant (constaté sur un système de fichiers réseau, où le verrou SQLite ne se prend
|
||||||
|
/// jamais : l'outil attendait cinq minutes puis renonçait).
|
||||||
|
/// <para>
|
||||||
|
/// ⚠️ La chaîne de connexion ci-dessous ne sert <b>qu'à la génération du code</b> : produire
|
||||||
|
/// une migration n'ouvre aucune base. Elle n'a donc pas à correspondre à quoi que ce soit, et
|
||||||
|
/// surtout pas à la base de production, qui est configurée par <c>ConnectionStrings__MaBibli</c>
|
||||||
|
/// dans l'unité systemd.
|
||||||
|
/// </para>
|
||||||
|
/// </remarks>
|
||||||
|
public sealed class FabriqueDbContextConception : IDesignTimeDbContextFactory<MaBibliDbContext>
|
||||||
|
{
|
||||||
|
public MaBibliDbContext CreateDbContext(string[] args)
|
||||||
|
{
|
||||||
|
var options = new DbContextOptionsBuilder<MaBibliDbContext>()
|
||||||
|
.UseSqlite("Data Source=mabibli-conception.db")
|
||||||
|
.Options;
|
||||||
|
|
||||||
|
return new MaBibliDbContext(options);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user