Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az SQLite-szolgáltató számos migrálási korlátozással rendelkezik. A legtöbb ilyen korlátozás a mögöttes SQLite-adatbázismotor korlátainak eredménye, és nem jellemző az EF-re.
Modellezési korlátozások
A közös relációs kódtár (amelyet az EF Core relációsadatbázis-szolgáltatók osztanak meg) api-kat határoz meg a legtöbb relációs adatbázismotorra jellemző modellezési fogalmakhoz. Az SQLite-szolgáltató néhány ilyen fogalmat nem támogat.
- Sémák
- Szekvenciák
- Az adatbázis által létrehozott párhuzamossági tokenek (lásd a dokumentációt)
Lekérdezési korlátozások
Az SQLite natív módon nem támogatja a következő adattípusokat. Az EF Core képes az ilyen típusú értékek olvasására és írására, és az egyenlőség lekérdezése (where e.Property == value) is támogatott. Az egyéb műveletek, például az összehasonlítás és a megrendelés azonban az ügyfél kiértékelését igénylik.
DateTimeOffsetdecimalTimeSpanulong
A DateTimeOffsethelyett DateTime értékeket javasoljuk. Ha több időzónát kezel, javasoljuk, hogy mentés előtt konvertálja az értékeket UTC-vé, majd térjen vissza a megfelelő időzónába.
A decimal típus nagy pontosságot biztosít. Ha azonban nincs szüksége erre a pontossági szintre, javasoljuk, hogy inkább double használjunk. Az értékkonverter segítségével továbbra is használhatja a decimal az osztályokban.
modelBuilder.Entity<MyEntity>()
.Property(e => e.DecimalProperty)
.HasConversion<double>();
Migrálási korlátozások
Az SQLite adatbázismotor nem támogatja az egyéb relációs adatbázisok többsége által támogatott sémaműveleteket. Ha az egyik nem támogatott műveletet egy SQLite-adatbázisra próbálja alkalmazni, egy NotSupportedException fog dobni.
A rendszer újraépítést kísérel meg bizonyos műveletek végrehajtásához. Az újraépítések csak az EF Core-modell részét képező adatbázis-összetevők esetében lehetségesek. Ha egy adatbázis-összetevő nem része a modellnek – például ha manuálisan lett létrehozva egy migráláson belül –, akkor a NotSupportedException továbbra is megjelenik.
| Művelet | Támogatott? |
|---|---|
| AddCheckConstraint | ✔ (újraépítés) |
| OszlopHozzáad | ✔ |
| AddForeignKey | ✔ (újraépítés) |
| AddPrimaryKey | ✔ (újraépítés) |
| EgyediKorlátHozzáadása | ✔ (újraépítés) |
| AlterColumn | ✔ (újraépítés) |
| CreateIndex | ✔ |
| TáblázatLétrehozása | ✔ |
| DropCheckConstraint | ✔ (újraépítés) |
| OszlopEltávolítás | ✔ (újraépítés) |
| DropForeignKey | ✔ (újraépítés) |
| DropIndex | ✔ |
| DropPrimaryKey | ✔ (újraépítés) |
| DropTable | ✔ |
| EgyediKorlátEltávolítása | ✔ (újraépítés) |
| RenameColumn | ✔ |
| Index átnevezése | ✔ (újraépítés) |
| Átnevezéstábla | ✔ |
| EnsureSchema | ✔ (no-op) |
| DropSchema | ✔ (no-op) |
| Beilleszt | ✔ |
| Frissít | ✔ |
| Töröl | ✔ |
Migrálási korlátozások kerülő megoldása
Ezen korlátozások némelyikét áthidalhatja úgy, hogy manuálisan írja be a kódot a migrálásba az újraépítés végrehajtásához. A tábla újraépítéséhez létre kell hoznia egy új táblát, adatokat kell átmásolnia az új táblába, el kell dobnia a régi táblát, és átneveznie az új táblát. Néhány lépés végrehajtásához a Sql metódust kell használnia.
További részleteket az SQLite dokumentációjában Más típusú táblaséma-módosítások című témakörben talál.
Idempotens szkriptkorlátozások
A többi adatbázistól eltérően az SQLite nem tartalmaz eljárási nyelvet. Emiatt nem lehet létrehozni az idempotens migrálási szkriptek által megkövetelt if-then logikát.
Ha ismeri az adatbázisra legutóbb alkalmazott migrálást, létrehozhat egy szkriptet az adott migrálásból a legújabb migrálásra.
dotnet ef migrations script CurrentMigration
Ellenkező esetben javasoljuk, hogy dotnet ef database update használatával alkalmazza a migrálásokat. A parancs futtatásakor megadhatja az adatbázisfájlt.
dotnet ef database update --connection "Data Source=My.db"
Egyidejű migrálások elleni védelem
Az EF9 bevezetett egy migrálási zárolási mechanizmust , amely védelmet nyújt az egyidejű migrálási végrehajtásokkal szemben. A SQL Server ellentétben, amely munkamenetszintű alkalmazászárat (sp_getapplock) használ, amely a kapcsolat bezárásakor automatikusan felszabadul, az SQLite nem rendelkezik beépített alkalmazászárakkal. Az EF Core ehelyett létrehoz egy __EFMigrationsLock táblát, és beszúr egy sort a zárolás megszerzéséhez.
Elhagyott zárolások kezelése
Ha az alkalmazás váratlanul leáll (például a folyamat leállítva a migrálás során), előfordulhat, hogy a __EFMigrationsLock táblában lévő zárolási sor talán nem kerül törlésre. Ez megakadályozza, hogy a későbbi migrálás befejeződjön, mert minden kísérlet határozatlan ideig várni fog a zárolás feloldására.
Egy elhagyatott zárolt állapot feloldásához törölje a __EFMigrationsLock táblát az adatbázisból:
DROP TABLE "__EFMigrationsLock";
Másik lehetőségként törölje az összes sort a táblából:
DELETE FROM "__EFMigrationsLock";
A zárolás törlése után a későbbi migrálási műveletek a szokásos módon folytatódnak. A rendszer szükség szerint automatikusan újra létrehozza a táblát.