Właściwości cieniowe to właściwości, które nie są zdefiniowane w klasie encji .NET, ale są zdefiniowane dla tego typu jednostki w modelu EF Core. Wartości i stany tych atrybutów są utrzymywane wyłącznie w trackerze zmian. Właściwości cieniowane są przydatne, gdy dane w bazie danych nie powinny być widoczne na mapowanym typie encji. Rdzeń Entity Framework wprowadza nowy typ atrybutu zwany atrybutem "shadow", który nie istnieje w EF 6.x.
Atrybut cienia tam nie ma. .NET klasy ency. Zamiast tego możesz skonfigurować go dla konkretnego typu jednostki w modelu danych danych. Można ją skonfigurować w metodzie OnModelCreating() klasy kontekstowej.
Poniższy diagram ilustruje atrybut cienia.
Jak pokazano na powyższym obrazku, atrybut cienia nie należy do twojej klasy encji. Dlatego nie możesz uzyskać do niego dostępu podczas uzyskiwania innych właściwości podmiotu. Właściwości cieniowane można konfigurować tylko dla typów jednostek podczas budowy modelu danych encji, a także będą mapowane na kolumny bazy danych. Wartość i stan właściwości cienia są utrzymywane wyłącznie w trackerze zmian.
Przyjrzyjmy się praktycznym aspektom właściwości cieni. Załóżmy, że musimy utrzymywać daty utworzenia i aktualizacji każdego rekordu w tabeli bazy danych. Nauczyłeś się ustawiać daty tworzenia i modyfikacji encji w EF Core, definiując właściwości CreatedDate i UpdatedDate w klasie encji. Tutaj zobaczymy, jak osiągnąć ten sam efekt, używając właściwości cieni zamiast włączania właściwości cienia do klasy encji.
Rozważmy następujące klasy jednostek studenckich.
Klasa uczniów powyżejAtrybuty CreatedDate i UpdatedDate nie są uwzględnioneaby zachować czas utworzenia lub aktualizacji. Konfigurujemy je jako właściwości cienia na encji Student.
Zdefiniuj właściwości cieni
Możesz użyć metody OnModelCreating() do definiowania właściwości cieni dla typów encji za pomocą Fluent API.
Poniższa konfiguracja konfiguruje dwie właściwości cieniowane, CreatedDate i UpdatedDate, dla jednostki Student.
Jak widać, metoda Property() służy do konfiguracji właściwości cieni. Określ nazwę właściwości cienia jako ciąg znaków, a typ jako parametr ogólny. Jeśli nazwa podana w metodzie Property() odpowiada nazwie istniejącej właściwości, EF Core skonfiguruje tę własność jako własność cienia zamiast wprowadzać nową własność cienia.
Właściwości cieniowe w bazie danych
Gdy właściwości cieni zostaną zdefiniowane, musimy zaktualizować schemat bazy danych, ponieważ właściwości cienia zostaną przypisane do odpowiadających kolumn bazy danych.
Aby to zrobić, dodaj migrację bazy danych w konsoli Menedżera Pakietów Visual Studio za pomocą następującego polecenia.
Tabela Student będzie teraz zawierać dwie kolumny: CreatedDate i UpdatedDate w SQL Server, jak pokazano poniżej.
Więc nawet jeśli nie uwzględnimy tych właściwości w klasie Student i nie skonfigurujemy ich jako właściwości cieniowe, baza danych będzie miała odpowiadające im kolumny.
Uzyskaj dostęp do własności cienia
Możesz użyć metody Property(), aby uzyskać lub ustawić wartość właściwości cienia w EntityEntry. Poniższy kod uzyskuje dostęp do wartości właściwości cieni.
Jednak w naszym scenariuszu chcemy automatycznie ustawić wartości tych właściwości cienia w metodzie SaveChanges(), aby nie musieć ich ręcznie ustawiać na każdym obiekcie entity. Dlatego nadpisz metodę SaveChanges() w klasie kontekstowej, jak pokazano poniżej.
Automatycznie ustawi to wartości dla właściwości cienia CreatedDate i UpdatedDate.
Teraz wykonaj następujący kod i sprawdź rekordy w bazie danych.
Powyższy kod wprowadzi następujące rekordy w CreatedDate i UpdatedDate dla uczniów.
Konfigurując właściwości cieni, nie musimy ich uwzględniać w klasie encji.
Konfiguruj właściwości cieni na wszystkich jednostkach
Zamiast ręcznie konfigurować właściwości cieni na wszystkich jednostkach jednocześnie, możesz je skonfigurować ręcznie.
Na przykład możemy skonfigurować wszystkie jednostki CreatedDate i UpdatedDate ostatnim razem, jak pokazano na poniższym obrazku.
Kiedy używać właściwości cienia?
Atrybut cienia można użyć w dwóch sytuacjach:
Kiedy nie chcesz wystawiać kolumn bazy danych na zmapowanych encjach, jak w opisanym powyżej scenariuszu. Kiedy nie chcesz ujawniać atrybutów kluczy obcych, a jedynie chcesz używać atrybutów nawigacyjnych do zarządzania relacjami. Właściwość klucza obcego będzie właściwością cienia i zostanie przypisana do kolumny bazy danych, ale nie zostanie ujawniona jako własność tej jednostki. (W EF Core, jeśli nie zdefiniujesz właściwości klucza obcego w klasie encji, automatycznie wygeneruje ona właściwość cienia dla tej klasy.) Nie musisz ręcznie konfigurować właściwości klucza obcego. )
Zasoby:
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.
|