Dědičnost TPH návrháře

Tento podrobný návod ukazuje, jak implementovat dědičnost TPH (table-per-hierarchy) v konceptuálním modelu pomocí Návrháře entity Framework (EF Designer). Dědičnost TPH používá k údržbě dat pro všechny typy entit v hierarchii dědičnosti jednu tabulku databáze.

V tomto názorném postupu namapujeme tabulku Person na tři typy entit: Person (základní typ), Student (odvozen od osoby) a Instructor (odvozeno od osoby). Vytvoříme koncepční model z databáze (Database First) a pak model upravíme tak, aby implementovaly dědičnost TPH pomocí Ef Designeru.

Pomocí modelu First je možné namapovat dědičnost TPH, ale museli byste napsat vlastní pracovní postup generování databáze, který je složitý. Tento pracovní postup byste pak přiřadili vlastnosti Pracovního postupu generování databáze v nástroji EF Designer. Jednodušší alternativou je použití code First.

Další možnosti dědičnosti

Typ tpT (Table-per-Type) je jiný typ dědičnosti, ve kterém jsou samostatné tabulky v databázi mapovány na entity, které se účastní dědičnosti.  Informace o mapování dědičnosti tabulek na typ pomocí nástroje EF Designer naleznete v tématu Dědičnost TPT nástroje EF Designer.

Model TPC (Table-per-Concrete Type Dědičnost) a smíšené dědičnosti jsou podporovány modulem runtime Entity Framework, ale návrhář EF nepodporuje. Pokud chcete použít TPC nebo smíšenou dědičnost, máte dvě možnosti: použijte Code First nebo ručně upravte soubor EDMX. Pokud se rozhodnete pracovat se souborem EDMX, okno Podrobností mapování se umístí do "nouzového režimu" a nebudete moct pomocí návrháře změnit mapování.

Požadavky

K dokončení toho návodu budete potřebovat:

Nastavení projektu

  • Otevřete Visual Studio 2012.
  • Vybrat soubor –> Nový –> Projekt
  • V levém podokně klikněte na Visual C# a pak vyberte šablonu konzoly .
  • Jako název zadejte TPHDBFirstSample .
  • Vyberte OK.

Vytvoření modelu

  • Klikněte pravým tlačítkem myši na název projektu v Průzkumník řešení a vyberte Přidat –> Nová položka.
  • V nabídce vlevo vyberte Data a pak v podokně Šablony vyberte ADO.NET Model dat entity.
  • Jako název souboru zadejte TPHModel.edmx a klepněte na tlačítko Přidat.
  • V dialogovém okně Zvolit obsah modelu vyberte Vygenerovat z databáze a potom klepněte na tlačítko Další.
  • Klikněte na Tlačítko Nový Připojení ion. V dialogovém okně vlastnosti Připojení ion zadejte název serveru (například (localdb)\mssqllocaldb), vyberte metodu ověřování, jako název databáze zadejte School a klikněte na tlačítko OK. Dialogové okno Zvolit data Připojení ion se aktualizuje nastavením připojení k databázi.
  • V dialogovém okně Zvolit databázové objekty v uzlu Tabulky vyberte tabulku Osoba .
  • Klikněte na Finish (Dokončit).

Zobrazí se Návrhář entit, který poskytuje návrhovou plochu pro úpravy modelu. Do modelu se přidají všechny objekty, které jste vybrali v dialogovém okně Zvolit databázové objekty.

To je způsob, jakým tabulka Person vypadá v databázi.

Person Table 

Implementace dědičnosti tabulek na hierarchii

Tabulka Person (Osoba ) má diskriminující sloupec, který může mít jednu ze dvou hodnot: Student (Student) a Instructor (Instruktor). V závislosti na hodnotě bude tabulka Person mapována na entitu Student nebo instruktor. Tabulka Person má také dva sloupce HireDate a EnrollmentDate, které musí mít hodnotu null, protože osoba nemůže být studentem a instruktorem současně (alespoň ne v tomto názorném postupu).

Přidání nových entit

  • Přidejte novou entitu. Uděláte to tak, že kliknete pravým tlačítkem myši na prázdné místo návrhové plochy Návrháře entity Framework a vyberete Přidat entitu>.
  • Zadejte instruktora pro název entity a v rozevíracím seznamu základního typu vyberte Osobu.
  • Klepněte na tlačítko OK.
  • Přidejte další novou entitu. Zadejte studenta pro název entity a v rozevíracím seznamu pro základní typ vyberte Možnost Osoba.

Na návrhovou plochu byly přidány dva nové typy entit. Šipka odkazuje z nových typů entit na typ entity Person . To znamená, že Osoba je základním typem pro nové typy entit.

  • Klikněte pravým tlačítkem myši na vlastnost HireDate entity Person. Vyberte Vyjmout (nebo použijte klávesu Ctrl-X).
  • Klikněte pravým tlačítkem myši na entitu Instruktor a vyberte Vložit (nebo použijte klávesu Ctrl-V).
  • Klikněte pravým tlačítkem myši na vlastnost HireDate a vyberte Vlastnosti.
  • V okně Vlastnosti nastavte nullable vlastnost false.
  • Klikněte pravým tlačítkem myši na vlastnost EnrollmentDate entity Person. (Datum registrace). Vyberte Vyjmout (nebo použijte klávesu Ctrl-X).
  • Klikněte pravým tlačítkem myši na entitu Student a vyberte Vložit (nebo použijte klávesu Ctrl-V).
  • Vyberte vlastnost EnrollmentDate a nastavte vlastnost Nullable na false.
  • Vyberte typ entity Osoba. V okně Vlastnosti nastavte jeho Abstraktní vlastnost na true.
  • Odstraňte diskriminující vlastnost od osoby. Důvod, proč by se měl odstranit, je vysvětlený v následující části.

Mapování entit

  • Klikněte pravým tlačítkem myši na instruktora a vyberte Mapování tabulek. Entita Instruktor je vybrána v okně Podrobnosti mapování.

  • V okně Podrobnosti mapování klikněte na <Přidat tabulku nebo zobrazení>. Pole <Přidat tabulku nebo zobrazení> se stane rozevíracím seznamem tabulek nebo zobrazení, na které lze namapovat vybranou entitu.

  • V rozevíracím seznamu vyberte Osobu .

  • Okno Podrobnosti mapování se aktualizuje s výchozími mapováními sloupců a možností pro přidání podmínky.

  • Klikněte na <Přidat podmínku>. Pole <Přidat podmínku> se stane rozevíracím seznamem sloupců, pro které lze podmínky nastavit.

  • V rozevíracím seznamu vyberte Diskriminátor .

  • Ve sloupci Operátor v okně Podrobnosti mapování vyberte v rozevíracím seznamu =.

  • Ve sloupci Hodnota/Vlastnost zadejte Instruktor. Konečný výsledek by měl vypadat takto:

    Mapping Details

  • Tento postup opakujte pro typ entity Student , ale nastavte podmínku na hodnotu Student .
    Důvod, proč jsme chtěli odstranit nediskriminační vlastnost, je to proto, že nemůžete mapovat sloupec tabulky více než jednou. Tento sloupec se použije pro podmíněné mapování, takže ho nelze použít i pro mapování vlastností. Jediný způsob, jak se dá použít pro obě podmínky, pokud podmínka používá porovnání Is Null nebo Is Not Null .

Dědičnost tabulek na hierarchii je teď implementovaná.

Final TPH

Použití modelu

Otevřete soubor Program.cs, kde je definována metoda Main. Do funkce Main vložte následující kód. Kód spustí tři dotazy. První dotaz vrátí všechny objekty person . Druhý dotaz používá metodu OfType k vrácení objektů instruktora . Třetí dotaz používá metodu OfType k vrácení objektů Student .

    using (var context = new SchoolEntities())
    {
        Console.WriteLine("All people:");
        foreach (var person in context.People)
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }

        Console.WriteLine("Instructors only: ");
        foreach (var person in context.People.OfType<Instructor>())
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }

        Console.WriteLine("Students only: ");
        foreach (var person in context.People.OfType<Student>())
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }
    }