SQLite EF Core-adatbázis-szolgáltató korlátozásai
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.
DateTimeOffset
decimal
TimeSpan
ulong
A DateTimeOffset
helyett 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 egy zárolási mechanizmust vezetett be a migrálások végrehajtásakor. Célja, hogy védelmet nyújtson az egyidejűleg végrehajtott több migrálással szemben, mivel az sérült állapotban hagyhatja az adatbázist. Ez az egyik lehetséges probléma, amely abból ered, hogy futásidőben migrálást alkalmaz a Migrate metódus használatával (további információt a Áttelepítések alkalmazása című témakörben talál). Ennek enyhítése érdekében az EF egy kizárólagos zárolást hoz létre az adatbázison a migrálási műveletek alkalmazása előtt.
Sajnos az SQLite nem rendelkezik beépített zárolási mechanizmussal, így az EF Core létrehoz egy külön táblát (__EFMigrationsLock
), és zárolásra használja. A zárolás a migrálás befejezésekor és a vetőkód végrehajtásának befejezésekor szabadul fel. Ha azonban a migrálás valamilyen okból nem helyreállítható módon meghiúsul, előfordulhat, hogy a zárolás nem lesz megfelelően feloldva. Ha ez történik, az egymást követő migrálások le lesznek tiltva az SQL végrehajtásában, ezért soha nem fejeződnek be. A tiltást manuálisan feloldhatja az adatbázis __EFMigrationsLock
táblájának törlésével.