Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poskytovatel SQLite má řadu omezení migrace. Většina těchto omezení je výsledkem omezení základního databázového stroje SQLite a nejsou specifická pro EF.
Omezení modelování
Společná relační knihovna (sdílená poskytovateli relačních databází EF Core) definuje rozhraní API pro koncepty modelování, které jsou společné pro většinu relačních databázových strojů. Poskytovatel SQLite nepodporuje několik těchto konceptů.
- Schémata
- Sekvence
- Tokeny souběžnosti generované databází (viz dokumentace)
Omezení dotazů
SQLite nativně nepodporuje následující datové typy. EF Core může číst a zapisovat hodnoty těchto typů a dotazování na rovnost (where e.Property == value) je také podporováno. Jiné operace, jako je například porovnání a řazení, však budou vyžadovat vyhodnocení klienta.
DateTimeOffsetdecimalTimeSpanulong
Místo toho DateTimeOffsetdoporučujeme používat DateTime hodnoty. Při zpracování více časových pásem doporučujeme hodnoty před uložením a následnou převodem zpět na příslušné časové pásmo převést na UTC.
Typ decimal poskytuje vysokou úroveň přesnosti. Pokud ale tuto úroveň přesnosti nepotřebujete, doporučujeme místo toho použít double . Pomocí převaděče hodnot můžete pokračovat v používání decimal ve třídách.
modelBuilder.Entity<MyEntity>()
.Property(e => e.DecimalProperty)
.HasConversion<double>();
Omezení migrace
Databázový stroj SQLite nepodporuje řadu operací schématu podporovaných většinou jiných relačních databází. Pokud se pokusíte použít jednu z nepodporovaných operací na databázi SQLite, bude vyvolána výjimka NotSupportedException.
Bude proveden pokus o opětovné sestavení za účelem provedení určitých operací. Opětovné sestavení je možné pouze pro artefakty databáze, které jsou součástí modelu EF Core. Pokud artefakt databáze není součástí modelu, například pokud je vytvořen ručně během migrace, NotSupportedException se stále vyvolá.
| Operace | Podporováno? |
|---|---|
| AddCheckConstraint | ✔ (opětovné sestavení) |
| PřidatSloupec | ✔ |
| AddForeignKey | ✔ (opětovné sestavení) |
| AddPrimaryKey (PřidatPrimárníKlíč) | ✔ (opětovné sestavení) |
| AddUniqueConstraint | ✔ (opětovné sestavení) |
| AlterColumn | ✔ (opětovné sestavení) |
| CreateIndex | ✔ |
| Vytvořit tabulku | ✔ |
| DropCheckConstraint | ✔ (opětovné sestavení) |
| DropColumn | ✔ (opětovné sestavení) |
| Odstranit cizí klíč | ✔ (opětovné sestavení) |
| DropIndex | ✔ |
| DropPrimaryKey | ✔ (opětovné sestavení) |
| DropTable | ✔ |
| OdstranitUnikátníOmezení | ✔ (opětovné sestavení) |
| PřejmenovatSloupce | ✔ |
| RenameIndex | ✔ (opětovné sestavení) |
| Přejmenovat tabulku | ✔ |
| Ujistěte se, žeSchema | ✔ (no-op) |
| DropSchema | ✔ (bez operace) |
| Vložit | ✔ |
| Aktualizovat | ✔ |
| Smazat | ✔ |
Řešení pro omezení migrace
Některá z těchto omezení můžete obejít ručním napsáním kódu v migracích za účelem opětovného sestavení. Opětovné sestavení tabulky zahrnuje vytvoření nové tabulky, kopírování dat do nové tabulky, vyřazení staré tabulky a přejmenování nové tabulky. K provedení některých z těchto kroků budete muset použít Sql metodu.
Další podrobnosti najdete v tématu Vytváření dalších typů změn schématu tabulky v dokumentaci SQLite.
Omezení idempotentního skriptu
Na rozdíl od jiných databází neobsahuje SQLite procedurální jazyk. Z tohoto důvodu neexistuje způsob, jak vygenerovat logiku if-then vyžadovanou idempotentními migračními skripty.
Pokud znáte poslední migraci použitou na databázi, můžete z této migrace na nejnovější migraci vygenerovat skript.
dotnet ef migrations script CurrentMigration
V opačném případě doporučujeme použít dotnet ef database update k provedení migrací. Při spuštění příkazu můžete zadat soubor databáze.
dotnet ef database update --connection "Data Source=My.db"
Souběžná ochrana migrace
EF9 zavedl mechanismus uzamčení migrace , který chrání před souběžnými spuštěními migrace. Na rozdíl od SQL Server, který používá zámek aplikace na úrovni relace (sp_getapplock), který se automaticky uvolní při zavření připojení, nemá SQLite integrované zámky aplikací. EF Core místo toho vytvoří __EFMigrationsLock tabulku a vloží řádek, aby získal zámek.
Zpracování opuštěných zámků
Pokud se aplikace neočekávaně ukončí (například proces je ukončen během migrace), nemusí se blokovaná řádka v __EFMigrationsLock tabulce vyčistit. Tím zabráníte dokončení jakékoli následné migrace, protože každý pokus počká na uvolnění zámku po neomezenou dobu.
Pokud chcete vyřešit opuštěný zámek, odstraňte __EFMigrationsLock tabulku z databáze:
DROP TABLE "__EFMigrationsLock";
Případně můžete odstranit všechny řádky z tabulky:
DELETE FROM "__EFMigrationsLock";
Po vymazání zámku budou následující operace migrace normálně pokračovat. Tabulka se podle potřeby automaticky znovu vytvoří.