Gyakorlat – Migrálás beállítása

Befejeződött

Ebben a leckében olyan C#-entitásosztályokat hoz létre, amelyek egy helyi SQLite-adatbázisban lévő táblákhoz lesznek leképezve. Az EF Core migrálási funkciója táblákat hoz létre ezekből az entitásokból.

A migrálás lehetővé teszi az adatbázisséma növekményes frissítését.

A projektfájlok lekérése

Első lépésként kérje le a projektfájlokat. A projektfájlok beszerzésének módjára a következő lehetőségek állnak rendelkezésre:

  • A GitHub Codespaces használata
  • A GitHub-adattár klónozása

Ha telepítve van egy kompatibilis tároló-futtatókörnyezet, a Dev Containers bővítmény használatával is megnyithatja az adattárat egy tárolóban az előre telepített eszközökkel.

A GitHub Codespaces használata

A kódtér egy felhőben üzemeltetett IDE. GitHub Codespaces használata esetén nyissa meg a böngésző adattárát. Válassza a Kód lehetőséget, majd hozzon létre egy új kódteret az main ágban.

A GitHub-adattár klónozása

Ha nem GitHub Codespace-eket használ, klónozhatja a GitHub-adattárat, majd megnyithatja a fájlokat mappaként a Visual Studio Code-ban.

  1. Nyisson meg egy parancsterminált, majd klónozza a projektet a GitHubról a parancssor használatával:

    git clone https://github.com/MicrosoftDocs/mslearn-persist-data-ef-core
    
  2. Nyissa meg az mslearn-persist-data-ef-core mappát, majd nyissa meg a projektet a Visual Studio Code-ban:

    cd mslearn-persist-data-ef-core
    code .
    

A kód áttekintése

Most már rendelkezik a projektfájlokkal, amellyel dolgoznia kell. Nézze meg, mi található a projektben, és tekintse át a kódot.

  • A projekt, amely egy ASP.NET Core webes API, a ContosoPizza könyvtárban található. A modulban hivatkozott fájlelérési utak a ContosoPizza könyvtárhoz vannak viszonyítva.
  • A Services/PizzaService.cs egy szolgáltatásosztály, amely definiálja a létrehozási, olvasási, frissítési és törlési (CRUD) metódusokat. Az összes metódus jelenleg a következőt dobja: System.NotImplementedException.
  • A Program.csPizzaService fájlban regisztrálva van a ASP.NET Core függőséginjektáló rendszerben.
  • A Controllers/PizzaController.cs egy olyan érték ApiController , amely a HTTP POST, a GET, a PUT és a DELETE parancsok végpontjait teszi elérhetővé. Ezek az igék meghívják a megfelelő CRUD metódusokat a következőre: PizzaService. PizzaService a konstruktorba PizzaController kerül.
  • A Models mappa tartalmazza a és PizzaControllera által PizzaService használt modelleket.
  • Az entitásmodellek, a Pizza.cs, a Topping.cs és a Sauce.cs a következő kapcsolatokkal rendelkeznek:
    • Egy pizza egy vagy több feltéttel is rendelkezhet.
    • A feltét egy vagy több pizzán is használható.
    • Egy pizza lehet egy mártás, de egy mártás használható sok pizza.

Az alkalmazás létrehozása

Az alkalmazás létrehozása a Visual Studio Code-ban:

  1. Az Explorer panelen kattintson a jobb gombbal a ContosoPizza könyvtárra, és válassza a Megnyitás integrált terminálban parancsot.

    Ekkor megnyílik a ContosoPizza könyvtár hatókörébe tartozó terminálpanel.

  2. Hozza létre az alkalmazást a következő paranccsal:

    dotnet build
    

    A kódnak figyelmeztetések és hibák nélkül kell létrejönnie.

NuGet-csomagok és EF Core-eszközök hozzáadása

Az ebben a modulban használható adatbázismotor az SQLite. Az SQLite egy egyszerű, fájlalapú adatbázismotor. Ez egy jó választás a fejlesztéshez és teszteléshez, és a kis léptékű éles környezetekhez is jó választás.

Megjegyzés

Ahogy korábban említettük, az EF Core adatbázis-szolgáltatói csatlakoztathatók. Az SQLite jó választás ehhez a modulhoz, mivel könnyű és platformfüggetlen. Ugyanazt a kódot használhatja különböző adatbázismotorokkal, például a SQL Server és a PostgreSQL használatával. Akár több adatbázismotort is használhat ugyanabban az alkalmazásban.

A kezdés előtt adja hozzá a szükséges csomagokat:

  1. A terminálpanelen futtassa a következő parancsot:

    dotnet add package Microsoft.EntityFrameworkCore.Sqlite
    

    Ez a parancs hozzáadja az EF Core SQLite adatbázis-szolgáltatót és annak összes függőségét tartalmazó NuGet-csomagot, beleértve a közös EF Core-szolgáltatásokat is.

  2. Futtassa ezt a parancsot:

    dotnet add package Microsoft.EntityFrameworkCore.Design
    

    Ez a parancs hozzáadja az EF Core-eszközökhöz szükséges csomagokat.

  3. A befejezéshez futtassa a következő parancsot:

    dotnet tool install --global dotnet-ef
    

    Ez a parancs telepíti dotnet efaz eszközt, amellyel migrálásokat és állványzatokat hozhat létre.

    Tipp

    Ha dotnet ef már telepítve van, a futtatásával dotnet tool update --global dotnet-effrissítheti.

Állványmodellek és DbContext

Most hozzáad és konfigurál egy implementációt DbContext . DbContext egy átjáró, amelyen keresztül kezelheti az adatbázist.

  1. Kattintson a jobb gombbal a ContosoPizza könyvtárra, és adjon hozzá egy új, Data nevű mappát.

  2. Az Adatok mappában hozzon létre egy PizzaContext.cs nevű új fájlt. Adja hozzá a következő kódot az üres fájlhoz:

    using Microsoft.EntityFrameworkCore;
    using ContosoPizza.Models;
    
    namespace ContosoPizza.Data;
    
    public class PizzaContext : DbContext
    {
        public PizzaContext (DbContextOptions<PizzaContext> options)
            : base(options)
        {
        }
    
        public DbSet<Pizza> Pizzas => Set<Pizza>();
        public DbSet<Topping> Toppings => Set<Topping>();
        public DbSet<Sauce> Sauces => Set<Sauce>();
    }
    

    A fenti kód a következőket végzi el:

    • A konstruktor elfogad egy típusú DbContextOptions<PizzaContext>paramétert. A konstruktor lehetővé teszi, hogy a külső kód átengedje a konfigurációt, hogy ugyanazt DbContext meg lehessen osztani a tesztelési és az éles kód között, és akár különböző szolgáltatókkal is használhatók.
    • A DbSet<T> tulajdonságok az adatbázisban létrehozandó tábláknak felelnek meg.
    • A táblanevek megegyeznek a PizzaContext osztálybeli DbSet<T> tulajdonságnevekkel. Szükség esetén felülbírálhatja ezt a viselkedést.
    • A példányosítás után elérhetővé Pizzasteszi a PizzaContext , Toppingsa és a Sauces tulajdonságokat. A tulajdonságok által közzétett gyűjtemények módosításait a rendszer propagálja az adatbázisba.
  3. A Program.cs fájlban cserélje le // Add the PizzaContext a következő kódra:

    builder.Services.AddSqlite<PizzaContext>("Data Source=ContosoPizza.db");
    

    A fenti kód a következőket végzi el:

    • Regisztrál a PizzaContext ASP.NET Core függőséginjektáló rendszerben.
    • Megadja, hogy az PizzaContext SQLite adatbázis-szolgáltatót fogja használni.
    • Definiál egy SQLite-kapcsolati sztring, amely egy helyi fájlra, a ContosoPizza.db-ra mutat.

    Megjegyzés

    Az SQLite helyi adatbázisfájlokat használ, így valószínűleg nem baj, ha a kapcsolati sztring kóddal kodekkentik. Az olyan hálózati adatbázisok esetében, mint a PostgreSQL és a SQL Server, mindig biztonságosan kell tárolnia a kapcsolati sztringeket. Helyi fejlesztéshez használja a Secret Managert. Éles környezetek esetén fontolja meg egy olyan szolgáltatás használatát, mint az Azure Key Vault.

  4. A Program.cs fájlban is cserélje le // Additional using declarations a következő kódra.

    using ContosoPizza.Data;
    

    Ez a kód az előző lépésben feloldja a függőségeket.

  5. Mentse az összes módosítást. A GitHub Codespaces automatikusan menti a módosításokat.

  6. Hozza létre az alkalmazást a terminálban a futtatásával dotnet build. A buildnek figyelmeztetések és hibák nélkül kell sikeresnek lennie.

Migrálás létrehozása és futtatása

Ezután hozzon létre egy áttelepítést, amellyel létrehozhatja a kezdeti adatbázist.

  1. Generáljon migrálást az adatbázistáblák létrehozásához az alábbi paranccsal:

    dotnet ef migrations add InitialCreate --context PizzaContext
    

    A fenti parancsban:

    • Az áttelepítés neveként az InitialCreate van megadva.
    • A --context beállítás adja meg a DbContext osztályból származtatott ContosoPizza projektbeli osztály nevét.

    Egy új Migrations könyvtár jelenik meg a ContosoPizza projekt gyökerében. A könyvtár tartalmaz egy <timestamp>_InitialCreate.cs fájlt, amely leírja az adatbázis adatdefiníciós nyelvre (DDL) való változási szkriptre fordítandó módosításait.

  2. Az InitialCreate migrálás alkalmazásához futtassa a következő parancsot:

    dotnet ef database update --context PizzaContext
    

    Ez a parancs alkalmazza a migrálást. A ContosoPizza.db nem létezik, ezért a migrálás a projektkönyvtárban jön létre.

    Tipp

    A dotnet ef eszköz minden platformon támogatott. A Windowson futó Visual Studióban a és Update-Database a Add-Migration PowerShell-parancsmagokat használhatja az integrált Package Manager-konzol ablakában.

Az adatbázis vizsgálata

Az EF Core létrehozott egy adatbázist az alkalmazáshoz. Ezután tekintse meg az adatbázisban az SQLite bővítményt.

  1. Az Explorer panelen kattintson a jobb gombbal a ContosoPizza.db fájlra, és válassza az Adatbázis megnyitása parancsot.

    Képernyőkép az Adatbázis megnyitása menüről a Visual Studio Code Explorer panelen.

    Az Explorer panelen megjelenik egy SQLite Explorer mappa.

    Képernyőkép az Explorer panelen található SQLite Explorer mappáról.

  2. Válassza ki az SQLite Explorer mappát a csomópont és az összes gyermekcsomópont kibontásához. Kattintson a jobb gombbal a ContosoPizza.db elemre, és válassza a Tábla megjelenítése "sqlite_master" lehetőséget a teljes adatbázisséma és az áttelepítés által létrehozott korlátozások megtekintéséhez.

    Képernyőkép a kibontott SQLite Explorer mappáról az Explorer panelen.

    • Létre lettek hozva az egyes entitásoknak megfelelő táblák.
    • A táblanevek a tulajdonságnevekből DbSet származnak a PizzaContextkövetkezőben: .
    • A névvel ellátott Id tulajdonságok az elsődleges kulcsmezők automatikus beírására lettek kikövetkeztetve.
    • Az EF Core elsődleges kulcs- és idegenkulcs-elnevezési konvenciók PK_<primary key property> a és FK_<dependent entity>_<principal entity>_<foreign key property>a. A <dependent entity> és a <principal entity> helyőrző az entitásosztályok nevének felel meg.

    Megjegyzés

    A ASP.NET Core MVC-hez hasonlóan az EF Core is konvenciót használ a konfigurációs megközelítéssel szemben. Az EF Core konvenciói a fejlesztő szándékának előzetes feltételezésével csökkentik a fejlesztéshez szükséges időt. Egy Id vagy <entity name>Id nevű tulajdonságról például feltételezhető, hogy egy tábla elsődleges kulcsaként generálandó. Ha úgy dönt, hogy nem fogadja el az elnevezési konvenciót, a tulajdonságot az [Key] attribútummal kell ellátni, vagy kulcsként kell konfigurálni a DbContextOnModelCreating metódusban.

A modell módosítása és az adatbázisséma frissítése

A Contoso Pizza vezetője új követelményeket támaszt, ezért módosítania kell az entitásmodelleket. A következő lépésekben leképezési attribútumok (más néven adatjegyzetek) használatával módosíthatja a modelleket.

  1. A Models\Pizza.cs fájlban végezze el a következő módosításokat:

    1. Adjon hozzá egy direktívát using a következőhöz: System.ComponentModel.DataAnnotations.
    2. Adjon hozzá egy [Required] attribútumot a Name tulajdonság elé, hogy szükség szerint megjelölje a tulajdonságot.
    3. Adjon hozzá egy [MaxLength(100)] attribútumot a tulajdonság elé a Name maximális 100 sztringhossz megadásához.
    using System.ComponentModel.DataAnnotations;
    
    namespace ContosoPizza.Models;
    
    public class Pizza
    {
        public int Id { get; set; }
    
        [Required]
        [MaxLength(100)]
        public string? Name { get; set; }
    
        public Sauce? Sauce { get; set; }
    
        public ICollection<Topping>? Toppings { get; set; }
    }
    
  2. A Models\Sauce.cs fájlban végezze el a következő módosításokat:

    1. Adjon hozzá egy direktívát using a következőhöz: System.ComponentModel.DataAnnotations.
    2. Adjon hozzá egy [Required] attribútumot a Name tulajdonság elé, hogy szükség szerint megjelölje a tulajdonságot.
    3. Adjon hozzá egy [MaxLength(100)] attribútumot a tulajdonság elé a Name maximális 100 sztringhossz megadásához.
    4. Adjon hozzá egy bool nevű tulajdonságot IsVegan.
    using System.ComponentModel.DataAnnotations;
    
    namespace ContosoPizza.Models;
    
    public class Sauce
    {
        public int Id { get; set; }
    
        [Required]
        [MaxLength(100)]
        public string? Name { get; set; }
    
        public bool IsVegan { get; set; }
    }
    
  3. A Models\Topping.cs fájlban végezze el a következő módosításokat:

    1. Adja hozzá using a és System.Text.Json.Serializationa parancshoz tartozó irányelveketSystem.ComponentModel.DataAnnotations.
    2. Adjon hozzá egy [Required] attribútumot a Name tulajdonság elé, hogy szükség szerint megjelölje a tulajdonságot.
    3. Adjon hozzá egy [MaxLength(100)] attribútumot a tulajdonság elé a Name maximális 100 sztringhossz megadásához.
    4. Adjon hozzá egy decimal nevű tulajdonságot Calories közvetlenül a Name tulajdonság után.
    5. Adjon hozzá egy Pizzas típusú tulajdonságot a több-a-többhöz kapcsolat létrehozásáhozToppingPizza-.ICollection<Pizza>?
    6. Adjon hozzá egy [JsonIgnore] attribútumot a Pizzas tulajdonsághoz.

    Fontos

    Ezek a lépések megakadályozzák, hogy Topping az entitások belevezzék a Pizzas tulajdonságot, amikor a webes API-kód szerializálja a JSON-ra adott választ. E változás nélkül a feltétek szerializált gyűjteménye magában foglalná a feltétet használó összes pizza gyűjteményét. A gyűjtemény minden pizzája feltéteket tartalmazna, amelyek mindegyike ismét tartalmazna egy pizzagyűjteményt. Ezt a végtelen huroktípust körkörös hivatkozásnak nevezzük, és nem szerializálható.

    using System.ComponentModel.DataAnnotations;
    using System.Text.Json.Serialization;
    
    namespace ContosoPizza.Models;
    
    public class Topping
    {
        public int Id { get; set; }
    
        [Required]
        [MaxLength(100)]
        public string? Name { get; set; }
    
        public decimal Calories { get; set; }
    
        [JsonIgnore]
        public ICollection<Pizza>? Pizzas { get; set; }
    }
    
  4. Mentse az összes módosítást, és futtassa a parancsot dotnet build.

  5. Generáljon migrálást az adatbázistáblák létrehozásához az alábbi paranccsal:

    dotnet ef migrations add ModelRevisions --context PizzaContext
    

    Létrejön egy nevű ModelRevisions migrálás.

    Megjegyzés

    Ez az üzenet jelenik meg: Egy olyan művelet volt állványzaton, amely adatvesztést okozhat. Ellenőrizze a migrálás pontosságát. Az üzenet azért jelenik meg, mert a kapcsolatot PizzaTopping egy-a-többről többről többre módosította, amihez egy meglévő idegenkulcs-oszlop elvetése szükséges. Mivel még nem rendelkezik adatokkal az adatbázisban, ez a módosítás nem problémás. Általában azonban érdemes ellenőrizni a létrehozott migrálást, amikor ez a figyelmeztetés úgy tűnik, hogy meggyőződik arról, hogy az áttelepítés nem töröl vagy csonkít adatokat.

  6. Az ModelRevisions migrálás alkalmazásához futtassa a következő parancsot:

    dotnet ef database update --context PizzaContext
    
  7. Az SQLite Explorer mappa címsorában válassza az Adatbázisok frissítése gombot.

    Képernyőkép az Adatbázisok frissítése gombról az SQLite Explorer címsorán.

  8. Az SQLite Explorer mappában kattintson a jobb gombbal a ContosoPizza.db elemre. Válassza az "sqlite_master" tábla megjelenítése lehetőséget a teljes adatbázisséma és -megkötések megtekintéséhez.

    Fontos

    Az SQLite bővítmény újra felhasználja a megnyitott SQLite lapokat.

    • A PizzaTopping pizza és a feltétek közötti több-a-többhöz kapcsolat ábrázolására egy illesztőtáblát hoztak létre.
    • Új mezők lettek hozzáadva a és Saucesa mezőhözToppings.
      • Calories oszlopként text van definiálva, mert az SQLite nem rendelkezik egyező decimal típussal.
      • Hasonlóképpen, IsVegan oszlopként van definiálva integer . Az SQLite nem definiál típust bool .
      • Mindkét esetben az EF Core kezeli a fordítást.
    • Az Name egyes táblák oszlopa meg van jelölve not null, de az SQLite nem rendelkezik kényszerrel MaxLength .

    Tipp

    Az EF Core-adatbázis-szolgáltatók leképezhetik a modellsémát egy adott adatbázis funkcióira. Bár az SQLite nem alkalmaz megfelelő kényszert a MaxLengthszámára, más adatbázisok, például a SQL Server és a PostgreSQL nem.

  9. Az SQLite Explorer mappában kattintson a jobb gombbal a táblára, és válassza a _EFMigrationsHistoryTáblázat megjelenítése parancsot. A tábla tartalmazza az adatbázisra alkalmazott áttelepítések listáját. Mivel két migrálást futtatott, két bejegyzés van: az egyik az InitialCreate migráláshoz, a másik a ModelRevisionshez.

Megjegyzés

Ez a gyakorlat leképezési attribútumokat (adatjegyzeteket) használt a modellek adatbázishoz való leképezéséhez. A leképezési attribútumok alternatívájaként a ModelBuilder fluent API-val konfigurálhatja a modelleket. Mindkét megközelítés érvényes, de egyes fejlesztők az egyik megközelítést részesítik előnyben a másikhoz képest.

Az adatbázisséma definiálásához és frissítéséhez migrálásokat használt. A következő leckében PizzaService befejezi az adatokat kezelő metódusokat.

Tesztelje tudását

1.

Egy entitásosztályban mi az elsődleges kulcsok tulajdonságnév-konvenciója?