Case Study: Risikoarme SQL-Datenbank-Migrationen mit Entity Framework Core
Diese Case Study beschreibt, wie sich SQL-Datenbank-Migrationen mit Entity Framework Core in Enterprise-Umgebungen kontrolliert, reviewbar und reproduzierbar umsetzen lassen.
In mehreren B2B-Projekten – u. a. im Auftrag eines Maschinenbaukonzerns mit Microsoft SQL Server sowie in eigenen Projekten mit PostgreSQL und MySQL – habe ich Datenbankstrukturen kontrolliert und reproduzierbar migriert.
Mein Grundsatz: Migrationen müssen planbar, reviewbar und reproduzierbar sein – nicht „Black Box“ zur Deploy-Zeit.
Warum ich keine Runtime-Migration in Production verwende
Das automatische Anwenden von Migrationen über context.Database.Migrate() zur Laufzeit ist bequem – aber in Enterprise-Umgebungen mit klaren Sicherheits- und Betriebsrichtlinien problematisch.
Typische Risiken
-
Erhöhte Rechte für die Anwendung erforderlich
Die App benötigt DDL-Rechte (CREATE/ALTER/DROP).
In produktiven Umgebungen gilt jedoch das Prinzip Least Privilege – die Anwendung darf keine Tabellenstruktur ändern. -
Race Conditions bei mehreren Instanzen
In skalierenden Umgebungen können mehrere App-Instanzen parallel versuchen, Migrationen auszuführen. -
Keine Review-Möglichkeit des generierten SQL
SQL wird direkt ausgeführt, ohne vorherige technische Prüfung. -
Fehlende Planbarkeit bei großen Tabellen
Längere Locks oder blockierende DDL-Operationen können produktive Systeme beeinträchtigen. -
Aufwändige Fehlerbehebung im Live-Deploy
Schlägt eine Migration in CI/CD fehl, entstehen oft:- Fix-Migrationen
- Pipeline-Restarts
- manuelle Reparaturen
- zunehmender Stage-Drift zwischen DEV/TEST/PROD
Diese Erfahrungen habe ich in realen Enterprise-Deployments mehrfach beobachtet.
Mein Migrations-Workflow (kontrolliert & reviewbar)
Stattdessen verwende ich einen kontrollierten, artefaktbasierten Ablauf:
Add-Migrationerstellen- Generierten C#-Migrationscode prüfen und ggf. anpassen
- SQL-Skript generieren (
dotnet ef migrations script) - Skript prüfen und bei Bedarf ergänzen
- Skript als Release-Artefakt bereitstellen
- Migration kontrolliert in DEV ausführen
- Nach erfolgreicher Validierung identisches Artefakt in TEST und PROD verwenden
Down-Migration in DEV
Falls eine Migration fehlerhaft ist, verwende ich gezielt eine Down-Migration in DEV, um:
- Schema-Fehler zu korrigieren
- DDL-Reihenfolge anzupassen
- Datenmigration zu verbessern
- Performance-Auswirkungen zu prüfen
Erst wenn die Migration stabil ist, wird sie für höhere Stages freigegeben.
Datenmigration als Bestandteil der Migration
Schema-Änderungen erfordern häufig begleitende Datenanpassungen.
Gängige Praxis:
- Neue Spalte hinzufügen
- Daten via
UPDATEtransformieren - Indizes neu erstellen
- Alte Spalte entfernen
Diese SQL-Schritte werden bewusst und nachvollziehbar in Migrationen integriert – nicht implizit zur Laufzeit ausgeführt.
Sicherstellung synchroner Stages (DEV / TEST / PROD)
- Verwendung derselben Migration-Assembly als Source of Truth
- Nutzung idempotenter SQL-Skripte
- Kontrolle über
__EFMigrationsHistory - Keine automatischen Schemaänderungen durch die App
Das Ergebnis: keine Stage-Drift, keine impliziten Strukturabweichungen.
Release-Artefakt statt Black Box
Migrationen werden als Build-Artefakt erzeugt, z. B.:
efcore-idempotent.sql- optional: EF Migration Bundle
Dieses Artefakt:
- stammt exakt aus dem Build der Applikation
- wird versioniert und archiviert
- wird in TEST und PROD identisch angewendet
Dadurch bleibt die Datenbankstruktur reproduzierbar und auditierbar.
Beispielhafte Projektstruktur
MySolution/
src/
MyApp.Persistence.SqlServer/
AppDbContext.cs
Migrations/
20260301_AddFoo.cs
AppDbContextModelSnapshot.cs
db/
migrations/
sqlserver/
2026-03-01_efcore-idempotent.sql
Primär werden Änderungen im Migration-C#-Code vorgenommen.
Falls SQL manuell angepasst werden muss (z. B. für Datenmigration oder DDL-Reihenfolge), wird dieses Skript zusätzlich versioniert.
Fazit
Ich setze Entity Framework Core Migrationen nicht als „automatischen Mechanismus“, sondern als kontrolliertes Architekturwerkzeug ein.
- Keine unnötigen DDL-Rechte für Produktionsanwendungen
- Reviewbare und testbare Migrationen
- Down-Migration als Sicherheitsnetz in DEV
- Synchronität zwischen DEV, TEST und PROD
- Planbare Änderungen auch bei großen Tabellen
Gerade in Enterprise-Umgebungen reduziert dieser Ansatz Risiken erheblich und sorgt für stabile, nachvollziehbare Deployments.