Megosztás a következőn keresztül:


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

Lásd még: