Freigeben über


SQLite EF Core-Datenbank-Anbieter-Einschränkungen

Der SQLite-Anbieter hat eine Reihe von Migrationseinschränkungen. Die meisten dieser Einschränkungen ergeben sich aus Einschränkungen im zugrunde liegenden SQLite-Datenbankmodul und sind nicht spezifisch für EF.

Modellierungseinschränkungen

Die gemeinsame relationale Bibliothek, die von den EF Core relationalen Datenbankanbietern gemeinsam genutzt wird, definiert APIs für Modellierungskonzepte, die den meisten relationalen Datenbankmanagementsystemen gemeinsam sind. Einige dieser Konzepte werden vom SQLite-Anbieter nicht unterstützt.

Abfrageeinschränkungen

SQLite unterstützt die folgenden Datentypen nicht nativ. EF Core kann Werte dieser Typen lesen und schreiben, und die Abfrage nach Gleichheit (where e.Property == value) wird ebenfalls unterstützt. Andere Vorgänge wie Vergleich und Anordnung erfordern jedoch eine Auswertung auf dem Computer des Benutzers.

  • DateTimeOffset
  • decimal
  • TimeSpan
  • ulong

Statt DateTimeOffsetempfehlen wir, DateTime-Werte zu verwenden. Wenn Sie mit mehreren Zeitzonen arbeiten, empfehlen wir Ihnen, die Werte vor dem Speichern in UTC zu konvertieren und dann in die entsprechende Zeitzone zurück zu konvertieren.

Der decimal Typ bietet eine hohe Genauigkeit. Wenn Sie diese Genauigkeit jedoch nicht benötigen, empfehlen wir stattdessen die Verwendung von double. Sie können einen Wertkonverter verwenden, um in Ihren Klassen weiterhin decimal zu verwenden.

modelBuilder.Entity<MyEntity>()
    .Property(e => e.DecimalProperty)
    .HasConversion<double>();

Migrationseinschränkungen

Das SQLite-Datenbankmodul unterstützt keine Anzahl von Schemavorgängen, die von den meisten anderen relationalen Datenbanken unterstützt werden. Wenn Sie versuchen, einen der nicht unterstützten Vorgänge auf eine SQLite-Datenbank anzuwenden, wird ein NotSupportedException ausgelöst.

Es wird versucht, eine Neuerstellung durchzuführen, um bestimmte Operationen durchzuführen. Neuerstellungen sind nur für Datenbankartefakte möglich, die Teil Ihres EF Core-Modells sind. Wenn ein Datenbankartefakt nicht Teil des Modells ist , z. B. wenn es manuell innerhalb einer Migration erstellt wurde, wird immer noch ein NotSupportedException ausgelöst.

Vorgang Unterstützt?
AddCheckConstraint ✔ (neu erstellen)
SpalteHinzufügen
AddForeignKey ✔ (neu erstellen)
AddPrimaryKey ✔ (neu erstellen)
EinzigartigeEinschränkungHinzufügen ✔ (neu erstellen)
AlterColumn ✔ (neu erstellen)
IndexErstellen
TabelleErstellen
DropCheckConstraint ✔ (neu erstellen)
DropColumn ✔ (neu erstellen)
DropForeignKey ✔ (neu erstellen)
DropIndex
DropPrimaryKey ✔ (neu erstellen)
DropTable
Einzigartige Einschränkung entfernen ✔ (neu erstellen)
RenameColumn
IndexUmbenennen ✔ (neu erstellen)
TabelleUmbenennen
EnsureSchema ✔ (no-op)
DropSchema ✔ (no-op)
Einfügen
Aktualisieren
Entfernen

Problemumgehung für Migrationseinschränkungen

Sie können einige dieser Einschränkungen umgehen, indem Sie manuell Code in Ihre Migrationen schreiben, um einen Neuaufbau durchzuführen. Um eine Tabelle neu zu erstellen, müssen Sie eine neue Tabelle erstellen, die Daten in die neue Tabelle kopieren, die alte Tabelle löschen und die neue Tabelle umbenennen. Sie müssen die Sql-Methode verwenden, um einige dieser Schritte auszuführen.

Weitere Informationen finden Sie unter Vornehmen anderer Arten von Tabellenschemaänderungen in der SQLite-Dokumentation.

Einschränkungen von Idempotent-Skripts

Im Gegensatz zu anderen Datenbanken enthält SQLite keine prozedurale Sprache. Aus diesem Grund gibt es keine Möglichkeit, die if-then-Logik zu generieren, die von den idempotenten Migrationsskripts benötigt wird.

Wenn Sie wissen, dass die letzte Migration auf eine Datenbank angewendet wurde, können Sie ein Skript aus dieser Migration zur neuesten Migration generieren.

dotnet ef migrations script CurrentMigration

Andernfalls wird empfohlen, dotnet ef database update zum Anwenden von Migrationen zu verwenden. Sie können die Datenbankdatei beim Ausführen des Befehls angeben.

dotnet ef database update --connection "Data Source=My.db"

Schutz vor gleichzeitigen Migrationen

EF9 hat einen Migrationssperrmechanismus eingeführt, um vor gleichzeitigen Migrationsausführungen zu schützen. Im Gegensatz zu SQL Server, die eine Anwendungssperre auf Sitzungsebene (sp_getapplock) verwendet, die beim Schließen der Verbindung automatisch freigegeben wird, verfügt SQLite nicht über integrierte Anwendungssperren. EF Core erstellt stattdessen eine __EFMigrationsLock Tabelle und fügt eine Zeile ein, um die Sperre abzurufen.

Umgang mit verlassenen Sperren

Wenn die Anwendung unerwartet abbricht (z. B. wird der Prozess während der Migration abgebrochen), wird die gesperrte Zeile in der __EFMigrationsLock Tabelle möglicherweise nicht bereinigt. Dadurch wird verhindert, dass eine nachfolgende Migration abgeschlossen wird, da jeder Versuch auf unbestimmte Zeit wartet, bis die Sperre freigegeben wird.

Wenn Sie eine abgebrochene Sperre auflösen möchten, legen Sie die __EFMigrationsLock Tabelle aus der Datenbank ab:

DROP TABLE "__EFMigrationsLock";

Alternativ können Sie auch alle Zeilen aus der Tabelle löschen:

DELETE FROM "__EFMigrationsLock";

Nach dem Löschen der Sperre werden nachfolgende Migrationsvorgänge normal ausgeführt. Die Tabelle wird bei Bedarf automatisch neu erstellt.

Siehe auch