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 🗙