Gestion de la Persistance des Données

Dans cette section, vous apprendrez comment Lino configure Entity Framework Core afin que la couche domaine reste totalement isolĂ©e et que les processus de migration de base de donnĂ©es soient prĂ©visibles et contrĂ´lĂ©s — que ce soit dans un service traditionnel (monolithique) ou dans un service modulaire.


Lors de la création d’un service via la commande lino new service, l’interface CLI demande deux décisions essentielles :

  • Architecture — service traditionnel ou modulaire.
  • Fournisseur de donnĂ©es — SqlServer ou PostgreSql (d’autres fournisseurs seront ajoutĂ©s dans de futures versions).

Dans les services traditionnels (monolithiques) ou modulaires (monolithiques modulaires), la base de données est unique par service. Cependant, dans les services modulaires, chaque module est mappé dans un schéma distinct au sein de la même base de données. Cela permet à chaque bounded context de conserver un espace de noms logique séparé, garantissant ainsi l’isolation fonctionnelle, le versionnage indépendant et des migrations plus organisées et sécurisées.

Configurations des types d’entité

Lino suit le principe Persistence‑Ignorant : les entités du domaine ne connaissent pas les détails de l’infrastructure. Pour cela, tout le mapping ORM est déplacé dans des classes qui implémentent IEntityTypeConfiguration<T>, situées dans Configurations/<EntityName>Configuration.cs.

  • Chaque entitĂ© possède un fichier de configuration dĂ©diĂ©.
  • Les conventions globales (ex. : decimal(18,2), collation, DateTime en utc) peuvent ĂŞtre centralisĂ©es dans ModelConfiguration.
  • Les configurations sont appliquĂ©es dans la mĂ©thode OnModelCreating du DbContext via modelBuilder.ApplyConfigurationsFromAssembly(...).

DbContexts

Le DbContext représente l'unité de transaction de l’application. Lino génère automatiquement :

  • Service traditionnel — un unique AppDbContext contenant tous les DbSet<TEntity>.
  • Service modulaire — un <Module>DbContext par bounded context. Ainsi, chaque module compile plus rapidement, dispose de cycles de migration plus courts et rĂ©duit le risque de conflits de fusion.

Tous les DbContext sont enregistrĂ©s dans <Module>/Infrastructure.Persistence, exposĂ©s via IUnitOfWork et rĂ©solus par dependency injection.

Repositories

Les repositories concrets se trouvent dans <Module>/Infrastructure.Persistence.Repositories et implémentent les interfaces définies dans l’espace de noms <Module>/Domain.Repositories. Chaque repository :

  • Encapsule des requĂŞtes complexes (LINQ, FromSql, projections DTO).
  • Expose uniquement les mĂ©thodes nĂ©cessaires au domaine (centrĂ© sur l’Aggregate Root).

Unité de Travail (Unit of Work)

L'Unité de Travail agit comme une frontière transactionnelle qui coordonne plusieurs dépôts, garantissant que toutes les opérations soient exécutées de manière atomique. Dans les scénarios simples, le DbContext lui-même est souvent suffisant. Cependant, Lino génère une implémentation dédiée (UnitOfWork) offrant un meilleur contrôle et une plus grande flexibilité.

  • Permet le contrĂ´le manuel des transactions via BeginTransaction, Commit et Rollback, lorsque nĂ©cessaire.
  • Publie des Ă©vĂ©nements de domaine pendant la transaction en cours, garantissant qu'ils se produisent dans le mĂŞme cycle de commit.
  • Persiste des Ă©vĂ©nements d'intĂ©gration dans la boĂ®te d'envoi (outbox), suivant le Transaction Outbox Pattern, assurant une livraison fiable dans les architectures distribuĂ©es (le cas Ă©chĂ©ant).

Gestion des migrations

Lino simplifie et automatise entièrement le processus de migrations de base de donnĂ©es avec Entity Framework Core, Ă©liminant les tâches rĂ©pĂ©titives et les risques courants d’incohĂ©rence. Pour crĂ©er une nouvelle migration, exĂ©cutez la commande suivante :

lino database migrations add

Lorsque vous exécutez la commande, un assistant interactif vous demandera les informations suivantes :

  • Service — Nom du projet oĂą la migration sera appliquĂ©e.
  • Module — (uniquement pour les services modulaires) module auquel appartient la modification.
  • Nom de la migration — Indiquez une description du changement (ex. : AddCustomerIsActive). Lino prendra automatiquement en charge la version actuelle et l’ordre d’incrĂ©mentation lors de la gĂ©nĂ©ration du script .sql, suivant ce modèle : /Scripts/v1.2.3/001_AddCustomerIsActive.sql.
Note : En plus des fichiers .cs générés par Entity Framework, Lino crée automatiquement le script .sql correspondant avec les instructions DDL. Cela facilite l’exécution manuelle des modifications ou la révision par les équipes d’infrastructure et les DBA.
Une erreur non gérée est survenue. Rafraîchir đź—™