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

Tento podrobný návod ukazuje, jak implementovat dědičnost tabulek podle typu (TPT) v modelu pomocí Návrháře entity Framework (EF Designer). Dědičnost typu tabulky používá samostatnou tabulku v databázi k udržování dat pro neděděné vlastnosti a vlastnosti klíče pro každý typ v hierarchii dědičnosti.

V tomto názorném postupu namapujeme entity Course (základní typ), OnlineCourse (odvozené od kurzu) a OnsiteCourse (odvozuje z kurzu) na tabulky se stejnými názvy. Vytvoříme model z databáze a pak model změníme tak, aby implementovaly dědičnost TPT.

Můžete také začít s modelem First a pak vygenerovat databázi z modelu. Ef Designer ve výchozím nastavení používá strategii TPT, takže jakákoli dědičnost v modelu se mapuje na samostatné tabulky.

Další možnosti dědičnosti

TPH (Table-per-Hierarchy) je dalším typem dědičnosti, ve které se jedna databázová tabulka používá k údržbě dat pro všechny typy entit v hierarchii dědičnosti.  Informace o mapování dědičnosti tabulek na hierarchii pomocí Návrháře entit naleznete v tématu Dědičnost TPH nástroje EF Designer. 

Mějte na paměti, že modul runtime Entity Framework podporuje modely dědičnosti tabulek na konkrétní typ (TPC) a smíšené dědičnosti, 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 TPTDBFirstSample .
  • Vyberte OK.

Vytvoření modelu

  • Klikněte pravým tlačítkem na projekt 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 TPTModel.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 tabulky Oddělení, Kurz, OnlineCourse a OnsiteCourse .
  • 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.

Implementace dědičnosti tabulek na typ

  • Na návrhové ploše klikněte pravým tlačítkem myši na typ entity OnlineCourse a vyberte Vlastnosti.
  • V okně Vlastnosti nastavte vlastnost Základní typ na Course.
  • Klikněte pravým tlačítkem myši na typ entity OnsiteCourse a vyberte Vlastnosti.
  • V okně Vlastnosti nastavte vlastnost Základní typ na Course.
  • Klikněte pravým tlačítkem myši na přidružení (čáru) mezi typy entit OnlineCourse a Course . Vyberte Odstranit z modelu.
  • Klikněte pravým tlačítkem myši na přidružení mezi typy entit OnsiteCourse a Course . Vyberte Odstranit z modelu.

Nyní odstraníme vlastnost CourseID z OnlineCourse a OnsiteCourse , protože tyto třídy dědí CourseID ze základního typu Course .

  • Klikněte pravým tlačítkem myši na vlastnost CourseID typu entity OnlineCourse a pak vyberte Odstranit z modelu.
  • Klikněte pravým tlačítkem myši na vlastnost CourseID typu entity OnsiteCourse a pak vyberte Odstranit z modelu.
  • Dědičnost tabulek na typ je nyní implementována.

Table Per Type

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 kurzy související se zadaným oddělením. Druhý dotaz používá metodu OfType k vrácení OnlineCourses související se zadaným oddělením. Třetí dotaz vrátí 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);
            }
        }
    }