24 Apr. 2025
Entity Framework mit SQLite und SQL Server
Problem
Migrations werden auf der Basis des Models und des Datenbank-Providers erstellt. Diese Datenbank-Provider enthalten auch spezifische Details über das Datenbanksystem z.B. ob eine string
Property als varchar(256)
(SQL Server) oder als text
(SQLite) mittels SQL erstellt werden soll. Und dabei entstehen Fehler, dass eine Migration auf SQL Server funktioniert, auf SQLite nicht. Hier ein kleines Beispiel beim Erstellen einer Tabelle.
Um das Problem zu lösen gibt es viele Ansätze, hier ist meiner, der für diese Blog Engine verwendet wurde. Der Code findet sich also auch hier.
DB Context
Im Rahmen dieses Blogs habe ich folgenden DbContext
mit Microsoft SQL Server (localdb) verwendet. Beim Umstellen auf SQLite mit GitHub Codespaces hat das Erstellen der Datenbank nicht OOTB funktioniert, weil die Migrations
Datentypen für string
verwendet haben,
Und hier müssen für die EF Tools zwei weitere Spezifikationen erstellt werden, die ausschließlich für das Erstellen der Migrations verwendet werden.
Für jedes Datenbanksystem wird also ein DB Context erstellt und anschließend für jedes Datenbanksystem Migrations erstellt.
dotnet ef migrations add InitialCreate --context SqlServerBlogEngineContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context SqliteBlogEngineContext --output-dir Migrations/SqliteMigrations
Verwendung
Im Blog bzw. dem Dependency Injection wird der originale Context BlogEngineContext
registriert und verwendet. Allerdings muss ein EnsureDatabase
den konkreten Typen erhalten damit der richtige Provider zum Erstellen der Datenbank verwendet wird.
Damit an möglichst wenig Stellen im Code der DB Provider abgefragt und unterschieden werden muss, ist und kann die EnsureDatabase
Methode nur von Basistypen abhängig sein.
Links
- Microsofts Tutorial zu Migrationen mit mehreren Anbietern