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
oderPostgreSql
(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
alsutc
) können inModelConfiguration
zentralisiert werden. - Konfigurationen werden in der
OnModelCreating
-Methode desDbContext
ĂĽbermodelBuilder.ApplyConfigurationsFromAssembly(...)
angewendet.
DbContexts
Der DbContext
stellt die Transaktionseinheit der Anwendung dar. Lino erzeugt automatisch:
- Traditioneller Dienst — ein einzelner
AppDbContext
, der alleDbSet<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
undRollback
, 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
.
.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.