Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
- Schemas
- Sequenties
- Door de database gegenereerde gelijktijdigheidstokens (raadpleeg de documentatie)
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.
DateTimeOffsetdecimalTimeSpanulong
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 mechanisme voor migratievergrendeling geïntroduceerd ter bescherming tegen gelijktijdige migratieuitvoeringen. In tegenstelling tot SQL Server, die gebruikmaakt van een toepassingsvergrendeling op sessieniveau (sp_getapplock) die automatisch wordt vrijgegeven wanneer de verbinding wordt gesloten, heeft SQLite geen ingebouwde toepassingsvergrendelingen. EF Core maakt in plaats daarvan een __EFMigrationsLock tabel en voegt een rij in om de vergrendeling te verkrijgen.
Afhandeling van verlaten vergrendelingen
Als de toepassing onverwacht wordt beëindigd (het proces wordt bijvoorbeeld tijdens de migratie beëindigd), wordt de vergrendelingsrij in de __EFMigrationsLock tabel mogelijk niet opgeschoond. Dit voorkomt dat de volgende migratie wordt voltooid, omdat elke poging voor onbepaalde tijd wacht totdat de vergrendeling wordt vrijgegeven.
Als u een verlaten vergrendeling wilt oplossen, verwijdert u de __EFMigrationsLock tabel uit de database:
DROP TABLE "__EFMigrationsLock";
U kunt ook alle rijen uit de tabel verwijderen:
DELETE FROM "__EFMigrationsLock";
Nadat de vergrendeling is gewist, worden de volgende migratiebewerkingen normaal uitgevoerd. De tabel wordt indien nodig automatisch opnieuw gemaakt.