Dziedziczenie TPT projektanta

W tym przewodniku krok po kroku pokazano, jak zaimplementować dziedziczenie tabeli na typ (TPT) w modelu przy użyciu projektanta platformy Entity Framework (EF Designer). Dziedziczenie tabeli na każdy typ używa oddzielnej tabeli w bazie danych do przechowywania danych dla niedziedziczonych właściwości i właściwości klucza dla każdego typu w hierarchii dziedziczenia.

W tym przewodniku zamapujemy jednostki Kurs (typ podstawowy), OnlineCourse (pochodzące z kursu) i OnsiteCourse (pochodzące z kursu) na tabele o tych samych nazwach. Utworzymy model z bazy danych, a następnie zmienimy model w celu zaimplementowania dziedziczenia TPT.

Możesz również zacząć od podejścia Model First, a następnie wygenerować bazę danych na podstawie modelu. Domyślnie Designer EF używa strategii TPT, dlatego każde dziedziczenie w modelu zostanie zamapowane na oddzielne tabele.

Inne opcje dziedziczenia

Tabela-per-Hierarchia (TPH) to inny typ dziedziczenia, w którym jedna tabela bazy danych jest wykorzystywana do przechowywania danych dla wszystkich typów jednostek w hierarchii dziedziczenia.  Aby uzyskać informacje na temat mapowania dziedziczenia tabeli na hierarchię za pomocą projektanta jednostek, zobacz Ef Designer TPH Inheritance (Dziedziczenie TPH projektanta EF). 

Należy pamiętać, że dziedziczenie typu tabela na konkretny typ (TPC) i modele dziedziczenia mieszanego są obsługiwane przez środowisko uruchomieniowe platformy Entity Framework, ale nie są obsługiwane przez projektanta Entity Framework. Jeśli chcesz użyć TPC lub dziedziczenia mieszanego, masz dwie opcje: użyj funkcji Code First lub ręcznie edytuj plik EDMX. Jeśli zdecydujesz się pracować z plikiem EDMX, okno Szczegóły mapowania zostanie umieszczone w trybie awaryjnym i nie będzie można użyć projektanta do zmiany mapowań.

Wymagania wstępne

Aby ukończyć ten przewodnik, potrzebne są następujące elementy:

Konfigurowanie projektu

  • Otwórz program Visual Studio 2012.
  • Wybierz Plik — Nowy —>> Projekt
  • W okienku po lewej stronie kliknij pozycję Visual C#, a następnie wybierz szablon Konsola .
  • Wprowadź TPTDBFirstSample jako nazwę.
  • Kliknij przycisk OK.

Tworzenie modelu

  • Kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań, a następnie wybierz polecenie Dodaj —> nowy element.
  • Wybierz pozycję Dane z menu po lewej stronie, a następnie wybierz pozycję ADO.NET Model danych jednostki w okienku Szablony.
  • Wprowadź TPTModel.edmx jako nazwę pliku, a następnie kliknij Dodaj.
  • W oknie dialogowym Wybieranie zawartości modelu wybierz pozycję** Wygeneruj z bazy danych**, a następnie kliknij przycisk Dalej.
  • Kliknij pozycję Nowe połączenie. W oknie dialogowym Właściwości połączenia wprowadź nazwę serwera (na przykład (localdb)\mssqllocaldb), wybierz metodę uwierzytelniania, wpisz School jako nazwę bazy danych, a następnie kliknij przycisk OK. Okno dialogowe Wybór połączenia danych jest zaktualizowane z ustawieniem połączenia z bazą danych.
  • W oknie dialogowym Wybieranie obiektów bazy danych, w węźle Tabele, wybierz tabele Dział, Kurs, KursOnline i KursNaMiejscu.
  • Kliknij przycisk Zakończ.

Zostanie wyświetlony projektant jednostek, który udostępnia powierzchnię projektową do edycji modelu. Wszystkie obiekty wybrane w oknie dialogowym Wybieranie obiektów bazy danych są dodawane do modelu.

Implementowanie dziedziczenia tabeli na typ

  • Na powierzchni projektowej kliknij prawym przyciskiem myszy typ jednostki OnlineCourse i wybierz pozycję Właściwości.
  • W oknie Właściwości ustaw właściwość Typ podstawowy na Course.
  • Kliknij prawym przyciskiem myszy typ jednostki OnsiteCourse i wybierz pozycję Właściwości.
  • W oknie Właściwości ustaw właściwość Typ podstawowy na Course.
  • Kliknij prawym przyciskiem myszy skojarzenie (wiersz) między typami jednostek OnlineCourse i Course. Wybierz pozycję Usuń z modelu.
  • Kliknij prawym przyciskiem myszy skojarzenie między typami encji OnsiteCourse i Course. Wybierz pozycję Usuń z modelu.

Teraz usuniemy właściwość CourseID z OnlineCourse i OnsiteCourse, ponieważ te klasy dziedziczą CourseID z typu podstawowego Course.

  • Kliknij prawym przyciskiem myszy właściwość CourseID typu jednostki OnlineCourse , a następnie wybierz pozycję Usuń z modelu.
  • Kliknij prawym przyciskiem myszy właściwość CourseID typu jednostki OnsiteCourse , a następnie wybierz polecenie Usuń z modelu
  • Dziedziczenie z tabelą na typ jest teraz implementowane.

Tabela na typ

Korzystanie z modelu

Otwórz plik Program.cs , w którym zdefiniowano metodę Main . Wklej następujący kod do funkcji Main . Kod wykonuje trzy zapytania. Pierwsze zapytanie przywraca wszystkie kursy związane z określonym działem. Drugie zapytanie używa metody OfType, aby zwrócić OnlineCourses powiązane z określonym wydziałem. Trzecie zapytanie zwraca wartość OnsiteCourses.

    using (var context = new SchoolEntities())
    {
        foreach (var department in context.Departments)
        {
            Console.WriteLine("The {0} department has the following courses:",
                               department.Name);

            Console.WriteLine("   All courses");
            foreach (var course in department.Courses )
            {
                Console.WriteLine("     {0}", course.Title);
            }

            foreach (var course in department.Courses.
                OfType<OnlineCourse>())
            {
                Console.WriteLine("   Online - {0}", course.Title);
            }

            foreach (var course in department.Courses.
                OfType<OnsiteCourse>())
            {
                Console.WriteLine("   Onsite - {0}", course.Title);
            }
        }
    }