Verwaltung der Datenpersistenz

In diesem Abschnitt erfahren Sie, wie Lino Entity Framework Core so konfiguriert, dass die Domänenschicht vollständig isoliert bleibt und die Datenbank-Migrationsprozesse vorhersehbar und kontrolliert ablaufen — sei es in einem traditionellen (monolithischen) oder in einem modularen Dienst.


Beim Erstellen eines Dienstes ĂĽber den Befehl lino new service fordert die CLI zwei wesentliche Entscheidungen:

  • Architektur — traditioneller oder modularer Dienst.
  • Datenanbieter — SqlServer oder PostgreSql (weitere Anbieter werden in zukĂĽnftigen Versionen hinzugefĂĽgt).

In traditionellen (monolithischen) oder modularen (modulare Monolithen) Diensten ist die Datenbank pro Dienst einmalig. In modularen Diensten wird jedoch jedes Modul in einem eigenen Schema innerhalb derselben Datenbank abgebildet. Dies ermöglicht es jedem bounded context, einen separaten logischen Namensraum zu behalten, was funktionale Isolation, unabhängige Versionierung und besser organisierte und sichere Migrationen gewährleistet.

Entity-Typ-Konfigurationen

Lino folgt dem Prinzip Persistence‑Ignorant: Die Domänen-Entitäten kennen keine Infrastrukturdetails. Daher wird das gesamte ORM-Mapping in Klassen ausgelagert, die IEntityTypeConfiguration<T> implementieren und sich in Configurations/<EntityName>Configuration.cs befinden.

  • Jede Entität hat eine eigene Konfigurationsdatei.
  • Globale Konventionen (z. B. decimal(18,2), Kollation, DateTime als utc) können in ModelConfiguration zentralisiert werden.
  • Konfigurationen werden in der OnModelCreating-Methode des DbContext ĂĽber modelBuilder.ApplyConfigurationsFromAssembly(...) angewendet.

DbContexts

Der DbContext stellt die Transaktionseinheit der Anwendung dar. Lino erzeugt automatisch:

  • Traditioneller Dienst — ein einzelner AppDbContext, der alle DbSet<TEntity> enthält.
  • Modularer Dienst — ein <Module>DbContext fĂĽr jeden bounded context. Dadurch kompiliert jedes Modul schneller, hat kĂĽrzere Migrationszyklen und reduziert das Risiko von Merge-Konflikten.

Alle DbContext werden in <Module>/Infrastructure.Persistence registriert, ĂĽber IUnitOfWork bereitgestellt und mittels dependency injection aufgelöst.

Repositories

Konkrete Repositories befinden sich in <Module>/Infrastructure.Persistence.Repositories und implementieren die im Namespace <Module>/Domain.Repositories definierten Schnittstellen. Jedes Repository:

  • Kapselt komplexe Abfragen (LINQ, FromSql, DTO-Projektionen).
  • Stellt nur die fĂĽr die Domäne notwendigen Methoden bereit (Aggregate Root-zentriert).

Unit of Work

Die Unit of Work fungiert als eine transaktionale Grenze, die mehrere Repositories koordiniert und sicherstellt, dass alle Operationen atomar ausgeführt werden. In einfachen Szenarien reicht oft der DbContext selbst aus. Lino generiert jedoch eine dedizierte Implementierung (UnitOfWork), die mehr Kontrolle und Flexibilität bietet.

  • Ermöglicht die manuelle Steuerung von Transaktionen ĂĽber BeginTransaction, Commit und Rollback, wenn erforderlich.
  • Veröffentlicht Domänenereignisse während der aktuellen Transaktion und stellt sicher, dass sie im selben commit-Zyklus auftreten.
  • Persistiert Integrationsereignisse im Outbox, gemäß dem Transaction Outbox Pattern, um eine zuverlässige Zustellung in verteilten Architekturen sicherzustellen (wenn zutreffend).

Migrations verwalten

Lino vereinfacht und automatisiert den Prozess der Datenbankmigrationen mit Entity Framework Core vollständig, wodurch sich wiederholende Aufgaben und häufige Inkonsistenzen eliminiert werden. Um eine neue Migration zu erstellen, fĂĽhren Sie den folgenden Befehl aus:

lino database migrations add

Beim AusfĂĽhren des Befehls fordert ein interaktiver Assistent folgende Informationen an:

  • Service — Name des Projekts, auf das die Migration angewendet wird.
  • Modul — (nur bei modularen Diensten) das Modul, dem die Ă„nderung zugeordnet ist.
  • Name der Migration — Geben Sie eine Beschreibung der Ă„nderung ein (z. B.: AddCustomerIsActive). Lino verwaltet automatisch die aktuelle Version und die inkrementelle Reihenfolge beim Erstellen des .sql-Skripts nach folgendem Muster: /Scripts/v1.2.3/001_AddCustomerIsActive.sql.
Hinweis: Zusätzlich zu den von Entity Framework generierten .cs-Dateien erstellt Lino auch automatisch das entsprechende .sql-Skript mit den DDL-Anweisungen. Dies erleichtert das manuelle Ausführen der Änderungen oder die Überprüfung durch Infrastruktur-Teams und DBAs.
Ein unbehandelter Fehler ist aufgetreten. Aktualisieren đź—™