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


Migrálások alkalmazása

Miután a migrációkat hozzáadtad, üzembe kell helyezni őket és alkalmazni az adatbázisokban. Különböző stratégiák léteznek erre, amelyek közül néhány jobban megfelel az éles környezeteknek, míg mások inkább a fejlesztési életciklusnak felelnek meg.

Jegyzet

Függetlenül attól, hogy milyen üzembe helyezési stratégiát alkalmaz, mindig tekintse át és tesztelje a létrehozott migrációkat, mielőtt azokat egy éles adatbázisra alkalmazná. Előfordulhat, hogy egy migráció elvet egy oszlopot, amikor a szándék az volt, hogy átnevezzék, vagy különböző okok miatt sikertelen lehet, amikor az adatbázisra alkalmazzák.

SQL-szkriptek

A migrálás éles adatbázisba való üzembe helyezésének ajánlott módja sql-szkriptek létrehozása. Ennek a stratégiának az előnyei a következők:

  • Az SQL-szkriptek a pontosság érdekében áttekinthetők; ez azért fontos, mert a sémamódosítások éles adatbázisokra való alkalmazása potenciálisan veszélyes művelet, amely adatvesztéssel járhat.
  • Bizonyos esetekben a szkriptek hangolhatók az éles adatbázis adott igényeinek megfelelően.
  • Az SQL-szkriptek egy üzembe helyezési technológiával együtt használhatók, és akár a CI-folyamat részeként is létrehozhatók.
  • Az SQL-szkriptek a DBA-k számára is biztosíthatók, és külön kezelhetők és archiválhatók.

Alapszintű használat

A következők létrehoznak egy SQL-szkriptet egy üres adatbázisból a legújabb migrálásra:

dotnet ef migrations script

From (a vélelmezett)

Az alábbiakban egy SQL-szkriptet hozunk létre az adott migrálásról a legújabb migrálásra.

dotnet ef migrations script AddNewTables

Feladóval és címzettel

Az alábbiakban egy SQL-szkriptet hozunk létre a megadott from migrálásból a megadott to migrálásra.

dotnet ef migrations script AddNewTables AddAuditTable

A visszaállítási szkript létrehozásához használhat egy to-nél frissebb from-t.

Figyelmeztetés

Jegyezze fel a lehetséges adatvesztési forgatókönyveket.

A szkriptgenerálás a következő két argumentumot fogadja el, amelyek jelzik, hogy melyik migrálási tartományt kell létrehozni:

  • A migráció a-ből az adatbázisra alkalmazott utolsó tranzíció legyen a szkript futtatása előtt. Ha nem alkalmazott áttelepítést, adja meg a 0 (ez az alapértelmezett).
  • A -ról-re történő migráció az utolsó, amelyet a szkript lefuttatása után alkalmazunk az adatbázisra. Ez a projekt utolsó migrálásának alapértelmezett értéke.

Idempotens SQL-szkriptek

A fent létrehozott SQL-szkriptek csak a séma egyik migrálásról a másikra való módosítására alkalmazhatók; Az Ön felelőssége, hogy a szkriptet megfelelően alkalmazza, és csak a megfelelő migrálási állapotban lévő adatbázisokra. Az EF Core emellett támogatja idempotens szkriptek létrehozását is, amelyek belsőleg ellenőrzik, hogy mely migrációk lettek már alkalmazva (a migrációs előzménytáblán keresztül), és csak a hiányzókat alkalmazza. Ez akkor hasznos, ha nem tudja pontosan, hogy mi volt az utolsó migrálás az adatbázisra, vagy ha több olyan adatbázisra helyez üzembe, amelyek mindegyike más migráláson van.

Az alábbiak idempotens migrálásokat hoznak létre:

dotnet ef migrations script --idempotent

Parancssori eszközök

Az EF parancssori eszközeivel migrálásokat alkalmazhat egy adatbázisra. Bár hatékony a migrációk helyi fejlesztéséhez és teszteléséhez, ez a megközelítés nem ideális a termelési adatbázisok kezeléséhez.

  • Az SQL-parancsokat közvetlenül az eszköz alkalmazza anélkül, hogy a fejlesztőnek lehetősége nyílik volna az adatok vizsgálatára vagy módosítására. Az éles üzemi környezetben ez veszélyes lehet.
  • A .NET SDK-t és az EF-eszközt éles kiszolgálókra kell telepíteni, és a projekt forráskódját kell használni.

Az alábbi frissítésekkel frissítheti az adatbázist a legújabb migrálásra:

dotnet ef database update

Az alábbi frissítésekkel frissítheti az adatbázist egy adott migrálásra:

dotnet ef database update AddNewTables

Vegye figyelembe, hogy ezzel a korábbi migrálásra is vissza lehet állítani.

Figyelmeztetés

Jegyezze fel a lehetséges adatvesztési forgatókönyveket.

Az áttelepítés parancssori eszközökkel történő alkalmazásával kapcsolatos további információkért tekintse meg az EF Core-eszközökre vonatkozó referencia.

Köteg

A migrálási csomagok egy fájlból álló végrehajtható fájlok, amelyek az áttelepítések adatbázisra való alkalmazásához használhatók. Az SQL-szkript és a parancssori eszközök néhány hiányosságával foglalkoznak:

  • Az SQL-szkriptek végrehajtásához további eszközökre van szükség.
  • Ezeknek az eszközöknek a tranzakciókezelése és a hibakeresési viselkedése inkonzisztens és néha váratlan. Ez nem definiált állapotban hagyhatja az adatbázist, ha hiba történik az áttelepítések alkalmazásakor.
  • A csomagok a CI-folyamat részeként hozhatók létre, és később egyszerűen végrehajthatók az üzembe helyezési folyamat részeként.
  • A csomagok a .NET SDK vagy az EF eszköz (vagy akár a .NET-futtatókörnyezet telepítése nélkül is végrehajthatók, ha önállóak), és nem igénylik a projekt forráskódját.

A következők létrehoznak egy csomagot:

dotnet ef migrations bundle

A következők létrehoznak egy önálló csomagot Linuxhoz:

dotnet ef migrations bundle --self-contained -r linux-x64

A csomagok létrehozásáról további információt az EF Core-eszközökcímű témakörben talál.

efbundle

Az eredményként kapott végrehajtható fájl neve alapértelmezés szerint efbundle. Segítségével frissítheti az adatbázist a legújabb migrálásra. Ez egyenértékű az dotnet ef database update vagy Update-Databasefuttatásával.

Érvek:

Vita / Érv Leírás
<MIGRATION> A cél migrációja. Ha '0', az összes migrálás visszaáll. Az utolsó migrálás alapértelmezett értéke.

Beállítások:

Opció Rövid Leírás
--connection <CONNECTION> Az adatbázis kapcsolati karakterlánca. Alapértelmezettként az az érték kerül meghatározásra, amelyet az AddDbContextben vagy az OnConfiguringban adtak meg.
--verbose -v Részletes kimenet megjelenítése.
--no-color Ne színezd ki a kimenetet.
--prefix-output A kimenetet előtagolja a szinttel.

Az alábbi példa a megadott felhasználónév és hitelesítő adatok használatával alkalmazza az áttelepítéseket egy helyi SQL Server-példányra:

.\efbundle.exe --connection 'Data Source=(local)\MSSQLSERVER;Initial Catalog=Blogging;User ID=myUsername;Password={;'$Credential;'here'}'

Figyelmeztetés

Ne felejtse el a appsettings.json-t a csomaggal együtt átmásolni. A csomag a végrehajtási könyvtárban található appsettings.json jelenlétére támaszkodik.

Példa a migrálási csomagra

A csomagnak tartalmaznia kell a migrációkat. Ezek dotnet ef migrations add használatával jönnek létre, ahogyan az , "Az első migráció létrehozása"részletezi. Miután az áttelepítések készen állnak az üzembe helyezésre, hozzon létre egy csomagot a dotnet ef migrations bundlesegítségével. Például:

PS C:\local\AllTogetherNow\SixOh> dotnet ef migrations bundle
Build started...
Build succeeded.
Building bundle...
Done. Migrations Bundle: C:\local\AllTogetherNow\SixOh\efbundle.exe
PS C:\local\AllTogetherNow\SixOh>

A kimenet egy futtatható fájl, amely a cél operációs rendszerhez megfelelő. Az én esetemben ez a Windows x64, ezért a efbundle.exe fájl került a helyi mappámba. A végrehajtható fájl futtatása a benne található migrálásokat alkalmazza:

PS C:\local\AllTogetherNow\SixOh> .\efbundle.exe
Applying migration '20210903083845_MyMigration'.
Done.
PS C:\local\AllTogetherNow\SixOh>

A dotnet ef database update vagy Update-Databaseesetén is csak akkor alkalmazza a migrációkat az adatbázisra, ha még nem alkalmazták őket. Ha például ugyanazt a csomagot futtatja újra, az nem tesz semmit, mivel nincsenek új migrálások:

PS C:\local\AllTogetherNow\SixOh> .\efbundle.exe
No migrations were applied. The database is already up to date.
Done.
PS C:\local\AllTogetherNow\SixOh>

Ha azonban módosításokat végez a modellen, és több migrálást hoz létre a dotnet ef migrations add-val, akkor ezek csomagolhatók egy új, végrehajtásra kész fájlba. Például:

PS C:\local\AllTogetherNow\SixOh> dotnet ef migrations add SecondMigration
Build started...
Build succeeded.
Done. To undo this action, use 'ef migrations remove'
PS C:\local\AllTogetherNow\SixOh> dotnet ef migrations add Number3
Build started...
Build succeeded.
Done. To undo this action, use 'ef migrations remove'
PS C:\local\AllTogetherNow\SixOh> dotnet ef migrations bundle --force
Build started...
Build succeeded.
Building bundle...
Done. Migrations Bundle: C:\local\AllTogetherNow\SixOh\efbundle.exe
PS C:\local\AllTogetherNow\SixOh>

Borravaló

A --force lehetőséggel felülírhatja a meglévő csomagot egy új csomaggal.

Az új csomag végrehajtása a következő két új migrálást alkalmazza az adatbázisra:

PS C:\local\AllTogetherNow\SixOh> .\efbundle.exe
Applying migration '20210903084526_SecondMigration'.
Applying migration '20210903084538_Number3'.
Done.
PS C:\local\AllTogetherNow\SixOh>

Alapértelmezés szerint a csomag az alkalmazás konfigurációjából származó adatbázis-kapcsolati sztringet használja. Egy másik adatbázis azonban migrálható a parancssorban található kapcsolati sztring átadásával. Például:

PS C:\local\AllTogetherNow\SixOh> .\efbundle.exe --connection "Data Source=(LocalDb)\MSSQLLocalDB;Database=SixOhProduction"
Applying migration '20210903083845_MyMigration'.
Applying migration '20210903084526_SecondMigration'.
Applying migration '20210903084538_Number3'.
Done.
PS C:\local\AllTogetherNow\SixOh>

Jegyzet

Ezúttal mindhárom migrációt végrehajtották, mivel egyiket sem alkalmazták még az éles adatbázisra.


Migrálások alkalmazása futtatókörnyezetben

Előfordulhat, hogy maga az alkalmazás programozott módon alkalmazza a migrálásokat, általában az indítás során. Bár hatékony a migrálások helyi fejlesztéséhez és teszteléséhez, ez a megközelítés nem megfelelő az éles adatbázisok kezeléséhez a következő okok miatt:

  • A 9-es előtti EF-verziók esetében, ha az alkalmazás több példánya fut, mindkét alkalmazás megpróbálhatja egyidejűleg alkalmazni az áttelepítést, és meghiúsulhat (vagy ami még rosszabb, adatsérülést okozhat).
  • Hasonlóképpen, ha egy alkalmazás hozzáfér az adatbázishoz, miközben egy másik alkalmazás migrálja azt, ez súlyos problémákat okozhat.
  • Az alkalmazásnak emelt szintű hozzáféréssel kell rendelkeznie az adatbázisséma módosításához. Általában ajánlott korlátozni az alkalmazás adatbázis-engedélyeit a production környezetben.
  • Fontos, hogy probléma esetén vissza lehessen állítani az alkalmazott migrálást. A többi stratégia ezt könnyen és kívülről biztosítja.
  • Az SQL-parancsokat közvetlenül a program alkalmazza anélkül, hogy a fejlesztőnek lehetősége nyílik volna az adatok vizsgálatára vagy módosítására. A termelési környezetben ez veszélyes lehet.

A migrálások programozott alkalmazásához hívja meg a context.Database.MigrateAsync(). Egy tipikus ASP.NET alkalmazás például a következőket teheti:

public static async Task Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
        await db.Database.MigrateAsync();
    }

    host.Run();
}

Vegye figyelembe, hogy MigrateAsync() a IMigrator szolgáltatásra épül, amely fejlettebb forgatókönyvekhez használható. A myDbContext.GetInfrastructure().GetService<IMigrator>() használatával érheti el.

Figyelmeztetés

  • Mielőtt éles környezetben használná ezt a megközelítést, alaposan gondolja át. A tapasztalatok azt mutatják, hogy ennek az üzembe helyezési stratégiának az egyszerűsége meghaladja az általa létrehozott problémákat. Fontolja meg sql-szkriptek migrálásból való generálásának a használatát.
  • Ne hívja EnsureCreatedAsync()MigrateAsync()előtt. EnsureCreatedAsync() megkerüli a migrálásokat a séma létrehozásához, ami MigrateAsync() meghiúsulását okozza.