Delen via


Beperkingen van SQLite EF Core-databaseprovider

De SQLite-provider heeft een aantal migratiebeperkingen. De meeste van deze beperkingen zijn het gevolg van beperkingen in de onderliggende SQLite-database-engine en zijn niet specifiek voor EF.

Modelleringsbeperkingen

De algemene relationele bibliotheek (gedeeld door relationele EF Core-databaseproviders) definieert API's voor modelleringsconcepten die gebruikelijk zijn voor de meeste relationele database-engines. Een aantal van deze concepten wordt niet ondersteund door de SQLite-provider.

Querybeperkingen

SQLite biedt geen systeemeigen ondersteuning voor de volgende gegevenstypen. EF Core kan waarden van deze typen lezen en schrijven, en het uitvoeren van query's op gelijkheid (where e.Property == value) wordt ook ondersteund. Voor andere bewerkingen, zoals vergelijking en ordening, is echter evaluatie op de client vereist.

  • DateTimeOffset
  • decimal
  • TimeSpan
  • ulong

In plaats van DateTimeOffsetraden we u aan DateTime waarden te gebruiken. Bij het verwerken van meerdere tijdzones wordt u aangeraden de waarden te converteren naar UTC voordat u deze opslaat en vervolgens weer converteert naar de juiste tijdzone.

Het decimal type biedt een hoge precisie. Als u dat precisieniveau echter niet nodig hebt, raden we u aan in plaats daarvan double te gebruiken. U kunt een waardeconversieprogramma gebruiken om decimal in uw klassen te blijven gebruiken.

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

Beperkingen voor migraties

De SQLite-database-engine biedt geen ondersteuning voor een aantal schemabewerkingen die worden ondersteund door het merendeel van andere relationele databases. Als u probeert een van de niet-ondersteunde bewerkingen toe te passen op een SQLite-database, wordt er een NotSupportedException gegenereerd.

Er wordt geprobeerd een herbouwbewerking uit te voeren om bepaalde bewerkingen uit te voeren. Herbouwen zijn alleen mogelijk voor databaseartefacten die deel uitmaken van uw EF Core-model. Als een databaseartefact geen deel uitmaakt van het model, bijvoorbeeld als het handmatig is gemaakt binnen een migratie, wordt er nog steeds een NotSupportedException gegenereerd.

Operatie Ondersteund?
ControleVoorwaardeToevoegen ✔ (herbouwen)
VoegKolomToe
VoegVreemdeSleutelToe ✔ (herbouwen)
AddPrimaryKey ✔ (herbouwen)
UniekeBeperkingToevoegen ✔ (herbouwen)
AlterColumn ✔ (herbouwen)
IndexMaken
MaakTabel
DropCheckConstraint ✔ (herbouwen)
DropColumn (KolomVerwijderen) ✔ (herbouwen)
VerwijderVreemdeSleutel ✔ (herbouwen)
DropIndex
PrimaireSleutelVerwijderen ✔ (herbouwen)
DropTable
VerwijderUniekeBeperking ✔ (herbouwen)
HernoemKolom
RenameIndex ✔ (herbouwen)
RenameTable
EnsureSchema ✔ (no-op)
DropSchema ✔ (no-op)
Invoegen
Bijwerken
Verwijderen

Omzeiling van beperkingen bij migraties.

U kunt een aantal van deze beperkingen omzeilen door handmatig code in uw migraties te schrijven om een herbouwbewerking uit te voeren. Het opnieuw opbouwen van tabellen omvat het maken van een nieuwe tabel, het kopiëren van gegevens naar de nieuwe tabel, het verwijderen van de oude tabel en het wijzigen van de naam van de nieuwe tabel. U moet de Sql methode gebruiken om een aantal van deze stappen uit te voeren.

Zie Andere soorten tabelschemawijzigingen aanbrengen in de SQLite-documentatie voor meer informatie.

Beperkingen voor Idempotent-scripts

In tegenstelling tot andere databases bevat SQLite geen procedurele taal. Daarom is er geen manier om de if-then logica te genereren die is vereist voor de idempotent-migratiescripts.

Als u weet dat de laatste migratie is toegepast op een database, kunt u een script genereren van die migratie naar de meest recente migratie.

dotnet ef migrations script CurrentMigration

Anders raden we u aan dotnet ef database update te gebruiken om migraties toe te passen. U kunt het databasebestand opgeven bij het uitvoeren van de opdracht.

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

Gelijktijdige migratiebeveiliging

EF9 heeft een vergrendelingsmechanisme geïntroduceerd bij het uitvoeren van migraties. Het is erop gericht om te beschermen tegen meerdere migratieuitvoeringen tegelijk, omdat de database hierdoor in een beschadigde status kan blijven. Dit is een van de mogelijke problemen die het gevolg zijn van het toepassen van migraties tijdens runtime met behulp van de methode Migrate (zie Migraties toepassen voor meer informatie). Om dit te verhelpen, maakt EF een exclusieve vergrendeling op de database voordat migratiebewerkingen worden toegepast.

SqLite heeft helaas geen ingebouwd vergrendelingsmechanisme, dus EF Core maakt een afzonderlijke tabel (__EFMigrationsLock) en gebruikt deze voor het vergrendelen. De vergrendeling wordt vrijgegeven wanneer de migratie is voltooid en de uitvoering van de seeding-code is voltooid. Als de migratie om een of andere reden echter mislukt op een niet-herstelbare manier, wordt de vergrendeling mogelijk niet correct vrijgegeven. Als dit gebeurt, kunnen volgende migraties geen SQL uitvoeren en worden daarom nooit voltooid. U kunt ze handmatig deblokkeren door de __EFMigrationsLock tabel in de database te verwijderen.

Zie ook