Gyakorlat – Migrálás beállítása
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.
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
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.cs
PizzaService
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 konstruktorbaPizzaController
kerül. - A Models mappa tartalmazza a és
PizzaController
a általPizzaService
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:
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.
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:
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.
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.
A befejezéshez futtassa a következő parancsot:
dotnet tool install --global dotnet-ef
Ez a parancs telepíti
dotnet ef
az eszközt, amellyel migrálásokat és állványzatokat hozhat létre.Tipp
Ha
dotnet ef
már telepítve van, a futtatásávaldotnet tool update --global dotnet-ef
frissí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.
Kattintson a jobb gombbal a ContosoPizza könyvtárra, és adjon hozzá egy új, Data nevű mappát.
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 ugyanaztDbContext
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álybeliDbSet<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é
Pizzas
teszi aPizzaContext
,Toppings
a és aSauces
tulajdonságokat. A tulajdonságok által közzétett gyűjtemények módosításait a rendszer propagálja az adatbázisba.
- A konstruktor elfogad egy típusú
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.
- Regisztrál a
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.
Mentse az összes módosítást. A GitHub Codespaces automatikusan menti a módosításokat.
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.
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 aDbContext
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.
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 ésUpdate-Database
aAdd-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.
Az Explorer panelen kattintson a jobb gombbal a ContosoPizza.db fájlra, és válassza az Adatbázis megnyitása parancsot.
Az Explorer panelen megjelenik egy SQLite Explorer mappa.
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.
- Létre lettek hozva az egyes entitásoknak megfelelő táblák.
- A táblanevek a tulajdonságnevekből
DbSet
származnak aPizzaContext
kö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 ésFK_<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 aDbContext
OnModelCreating
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.
A Models\Pizza.cs fájlban végezze el a következő módosításokat:
- Adjon hozzá egy direktívát
using
a következőhöz:System.ComponentModel.DataAnnotations
. - Adjon hozzá egy
[Required]
attribútumot aName
tulajdonság elé, hogy szükség szerint megjelölje a tulajdonságot. - Adjon hozzá egy
[MaxLength(100)]
attribútumot a tulajdonság elé aName
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; } }
- Adjon hozzá egy direktívát
A Models\Sauce.cs fájlban végezze el a következő módosításokat:
- Adjon hozzá egy direktívát
using
a következőhöz:System.ComponentModel.DataAnnotations
. - Adjon hozzá egy
[Required]
attribútumot aName
tulajdonság elé, hogy szükség szerint megjelölje a tulajdonságot. - Adjon hozzá egy
[MaxLength(100)]
attribútumot a tulajdonság elé aName
maximális 100 sztringhossz megadásához. - Adjon hozzá egy
bool
nevű tulajdonságotIsVegan
.
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; } }
- Adjon hozzá egy direktívát
A Models\Topping.cs fájlban végezze el a következő módosításokat:
- Adja hozzá
using
a ésSystem.Text.Json.Serialization
a parancshoz tartozó irányelveketSystem.ComponentModel.DataAnnotations
. - Adjon hozzá egy
[Required]
attribútumot aName
tulajdonság elé, hogy szükség szerint megjelölje a tulajdonságot. - Adjon hozzá egy
[MaxLength(100)]
attribútumot a tulajdonság elé aName
maximális 100 sztringhossz megadásához. - Adjon hozzá egy
decimal
nevű tulajdonságotCalories
közvetlenül aName
tulajdonság után. - Adjon hozzá egy
Pizzas
típusú tulajdonságot a több-a-többhöz kapcsolat létrehozásáhozTopping
Pizza
-.ICollection<Pizza>?
- Adjon hozzá egy
[JsonIgnore]
attribútumot aPizzas
tulajdonsághoz.
Fontos
Ezek a lépések megakadályozzák, hogy
Topping
az entitások belevezzék aPizzas
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; } }
- Adja hozzá
Mentse az összes módosítást, és futtassa a parancsot
dotnet build
.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
Pizza
Topping
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.Az ModelRevisions migrálás alkalmazásához futtassa a következő parancsot:
dotnet ef database update --context PizzaContext
Az SQLite Explorer mappa címsorában válassza az Adatbázisok frissítése gombot.
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
Sauces
a mezőhözToppings
.Calories
oszlopkénttext
van definiálva, mert az SQLite nem rendelkezik egyeződecimal
típussal.- Hasonlóképpen,
IsVegan
oszlopként van definiálvainteger
. Az SQLite nem definiál típustbool
. - Mindkét esetben az EF Core kezeli a fordítást.
- Az
Name
egyes táblák oszlopa meg van jelölvenot null
, de az SQLite nem rendelkezik kényszerrelMaxLength
.
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
MaxLength
számára, más adatbázisok, például a SQL Server és a PostgreSQL nem.- A
Az SQLite Explorer mappában kattintson a jobb gombbal a táblára, és válassza a
_EFMigrationsHistory
Tá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.