Shadow-egenskaper er egenskaper som ikke er definert i .NET-entitetsklassen, men som er definert for den entitetstypen i EF Core-modellen. Verdiene og tilstandene til disse attributtene vedlikeholdes utelukkende i endringssporeren. Skyggelagte egenskaper er nyttige når data i en database ikke skal eksponeres på den kartlagte entitetstypen. Entity Framework-kjernen introduserer en ny type attributt kalt "shadow"-attributtet, som ikke finnes i EF 6.x.
Skyggeattributtet er ikke der. .NET-entitetsklasser. I stedet kan du konfigurere den for en spesifikk entitetstype i entitetsdatamodellen. Den kan konfigureres i OnModelCreating()-metoden i kontekstklassen.
Følgende diagram illustrerer skyggeattributten.
Som vist på bildet over, tilhører ikke shadow-attributtet din entity-klasse. Derfor kan du ikke få tilgang til den når du får tilgang til andre egenskaper ved en enhet. Skyggelagte egenskaper kan kun konfigureres for entitetstyper når man bygger entitetsdatamodellen, og de vil også bli kartlagt til databasekolonner. Verdien og tilstanden til skyggeegenskapen opprettholdes kun i endringssporeren.
La oss forstå de praktiske aspektene ved skyggeegenskaper. La oss si at vi må opprettholde opprettelses- og oppdateringsdatoene for hver post i databasetabellen. Du lærte hvordan du setter opprettelses- og endringsdatoer for enheter i EF Core ved å definere egenskapene CreatedDate og UpdatedDate i entity-klassen. Her skal vi se hvordan vi kan oppnå samme resultat ved å bruke skyggeegenskaper i stedet for å inkludere skyggeegenskaper i entitetsklassen.
Vurder følgende student-enhetsklasser.
Studentklassen ovenforAttributtene CreatedDate og UpdatedDate er ikke inkludertfor å opprettholde tiden da den ble opprettet eller oppdatert. Vi konfigurerer dem som skyggeegenskaper på Student-enheten.
Definer skyggeegenskaper
Du kan bruke OnModelCreating()-metoden for å definere skyggeegenskaper for entitetstyper ved hjelp av Fluent API.
Følgende konfigurasjon konfigurerer to skyggelagte egenskaper, CreatedDate og UpdatedDate, for Student-enheten.
Som du kan se, brukes Property()-metoden for å konfigurere skyggeegenskapene. Spesifiser navnet på shadow-egenskapen som en streng og typen som en generisk parameter. Hvis navnet som er spesifisert i Property()-metoden samsvarer med navnet på en eksisterende egenskap, vil EF Core konfigurere den eksisterende egenskapen som en skyggeegenskap i stedet for å introdusere en ny skyggeegenskap.
Skyggeegenskaper i databasen
Når skyggeegenskapene er definert, må vi oppdatere databaseskjemaet siden skyggeegenskapene vil bli kartlagt til de tilsvarende databasekolonnene.
For å gjøre dette, legg til en databasemigrering i Visual Studios Package Manager-konsoll ved å bruke følgende kommando.
Studenttabellen vil nå inkludere to kolonner, CreatedDate og UpdatedDate i SQL Server, som vist nedenfor.
Så selv om vi ikke inkluderer disse egenskapene i Student-klassen og konfigurerer dem som skyggeegenskaper, vil databasen ha de tilsvarende kolonnene.
Få tilgang til skyggeeiendommen
Du kan bruke Property()-metoden for å hente eller sette verdien på shadow-egenskapen i EntityEntry. Følgende kode gir tilgang til verdien av skyggeegenskapen.
Men i vårt scenario ønsker vi automatisk å sette verdiene til disse skyggeegenskapene i SaveChanges()-metoden, slik at vi slipper å sette dem manuelt på hvert entitetsobjekt. Så, overstyr SaveChanges()-metoden i kontekstklassen som vist nedenfor.
Dette vil automatisk sette verdier for skyggeegenskapene CreatedDate og UpdatedDate.
Nå kjører du følgende kode og sjekker postene i databasen.
Koden ovenfor vil sette inn følgende poster i CreatedDate og UpdatedDate for studenter.
Så ved å konfigurere shadow-egenskapene trenger vi ikke å inkludere dem i entity-klassen.
Konfigurer skyggeegenskapene på alle enheter
I stedet for å manuelt konfigurere skyggeegenskaper på alle enheter samtidig, kan du konfigurere dem manuelt.
For eksempel kan vi konfigurere alle enheter med CreatedDate og UpdatedDate sist, som vist i bildet nedenfor.
Når bør man bruke skyggeegenskapen?
Skyggeattributtet kan brukes i to situasjoner:
Når du ikke vil eksponere databasekolonner på kartlagte enheter, slik som i scenarioet diskutert ovenfor. Når du ikke vil eksponere fremmednøkkelattributter, men kun bruke navigasjonsattributter for å håndtere relasjoner. Fremmednøkkelegenskapen vil være en skyggeegenskap og vil bli kartlagt til databasekolonnen, men vil ikke bli eksponert som en egenskap til enheten. (I EF Core, hvis du ikke definerer en fremmednøkkelegenskap i en entitetsklasse, vil den automatisk generere en skyggeegenskap for denne.) Du trenger ikke å konfigurere fremmednøkkelegenskaper manuelt. )
Ressurser:
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
|