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.

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 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.

Lásd még: