Tieňové vlastnosti sú vlastnosti, ktoré nie sú definované v triede entity .NET, ale sú definované pre daný typ entity v EF Core modeli. Hodnoty a stavy týchto atribútov sú udržiavané čisto v sledovači zmien. Tieňované vlastnosti sú užitočné, keď údaje v databáze by nemali byť vystavené na mapovanom type entity. Jadro Entity Framework zavádza nový typ atribútu nazývaný atribút "tieň", ktorý v EF 6.x neexistuje.
Atribút tieňa tam nie je. .NET entity class. Namiesto toho ho môžete nakonfigurovať pre konkrétny typ entity v dátovom modeli entity. Môže byť nakonfigurovaný metódou OnModelCreating() pre kontextovú triedu.
Nasledujúci diagram ilustruje atribút tieňa.
Ako je znázornené na obrázku vyššie, atribút tieňa nepatrí do vašej triedy entity. Preto k nemu nemôžete pristupovať pri prístupe k iným vlastnostiam entity. Tieňované vlastnosti je možné nastaviť len pre typy entít pri budovaní dátového modelu entít a budú tiež mapované na databázové stĺpce. Hodnota a stav tieňovej vlastnosti sú udržiavané iba v sledovači zmien.
Poďme pochopiť praktické aspekty tieňových vlastností. Povedzme, že potrebujeme udržiavať dátumy vytvorenia a aktualizácie každého záznamu v databázovej tabuľke. Naučili ste sa, ako nastaviť dátumy vytvorenia a modifikácie entít v EF Core definovaním vlastností CreatedDate a UpdatedDate v triede entity. Tu uvidíme, ako dosiahnuť rovnaký výsledok použitím tieňových vlastností namiesto zahrnutia tieňových vlastností do triedy entity.
Zvážte nasledujúce triedy entít Študent.
Študentská trieda vyššieAtribúty CreatedDate a UpdatedDate nie sú zahrnutéaby sa zachoval čas vytvorenia alebo aktualizácie. Konfigurujeme ich ako tieňové vlastnosti na entite Študent.
Definujte tieňové vlastnosti
Metódu OnModelCreating() môžete použiť na definovanie tieňových vlastností pre typy entít pomocou Fluent API.
Nasledujúca konfigurácia konfiguruje dve tieňované vlastnosti, CreatedDate a UpdatedDate, pre entitu Student.
Ako vidíte, na konfiguráciu tieňových vlastností sa používa metóda Property(). Špecifikujte názov vlastnosti tieňa ako reťazec a typ ako generický parameter. Ak názov špecifikovaný v metóde Property() zodpovedá názvu existujúcej vlastnosti, EF Core túto existujúcu vlastnosť nakonfiguruje ako tieňovú vlastnosť namiesto zavádzania novej tieňovej vlastnosti.
Tieňové vlastnosti v databáze
Keď sú vlastnosti tieňov definované, musíme aktualizovať schému databázy, pretože vlastnosti tieňa budú mapované na príslušné stĺpce databázy.
Na to pridajte migráciu databázy do konzoly Package Manager vo Visual Studio pomocou nasledujúceho príkazu.
Tabuľka Študent bude teraz obsahovať dva stĺpce, Dátum vytvorenia a Dátum aktualizácie v SQL Serveri, ako je uvedené nižšie.
Takže aj keď tieto vlastnosti nezahrnieme do triedy Student a nekonfigurujeme ich ako tieňové vlastnosti, databáza bude mať príslušné stĺpce.
Prístup k tieňovému majetku
Môžete použiť metódu Property() na získanie alebo nastavenie hodnoty tieňovej vlastnosti v EntityEntry. Nasledujúci kód pristupuje k hodnote tieňovej vlastnosti.
V našom scenári však chceme automaticky nastaviť hodnoty týchto tieňových vlastností v metóde SaveChanges(), aby sme ich nemuseli manuálne nastavovať na každom entity objekte. Preto prepíšte metódu SaveChanges() v kontextovej triede, ako je uvedené nižšie.
To automaticky nastaví hodnoty pre tieňové vlastnosti CreatedDate a UpdatedDate.
Teraz spustite nasledujúci kód a skontrolujte záznamy v databáze.
Vyššie uvedený kód vloží nasledujúce záznamy do Dátumu vytvorenia a Dátumu aktualizácie pre študentov.
Takže konfiguráciou tieňových vlastností ich nemusíme zahrnúť do triedy entity.
Nakonfigurujte tieňové vlastnosti na všetkých entitách
Namiesto manuálnej konfigurácie tieňových vlastností na všetkých entitách naraz ich môžete nastaviť manuálne.
Napríklad môžeme naposledy nastaviť všetky entity CreatedDate a UpdatedDate, ako je znázornené na nasledujúcom obrázku.
Kedy použiť tieňovú vlastnosť?
Atribút tieňa môže byť použitý v dvoch situáciách:
Keď nechcete vystavovať databázové stĺpce na mapovaných entitách, ako je to scenár uvedený vyššie. Keď nechcete vystavovať atribúty cudzích kľúčov, ale chcete používať navigačné atribúty len na správu vzťahov. Vlastnosť cudzieho kľúča bude tieňová vlastnosť a bude mapovaná na stĺpec databázy, ale nebude vystavená ako vlastnosť entity. (V EF Core, ak nedefinujete vlastnosť cudzieho kľúča v triede entity, automaticky vygeneruje tieňovú vlastnosť pre toto.) Vlastnosti cudzieho kľúča nemusíte manuálne konfigurovať. )
Zdroje:
Prihlásenie na hypertextový odkaz je viditeľné.
Prihlásenie na hypertextový odkaz je viditeľné.
|