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.

Blog Tabelle SQL Server vs. SQLite

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