Héritage TPT du concepteur

Cette procédure pas à pas montre comment implémenter l’héritage table par type (TPT) dans votre modèle à l’aide de Entity Framework Designer (EF Designer). L'héritage TPT (table par type) utilise une table distincte de la base de données pour maintenir des données des propriétés non héritées et des propriétés de clé pour chaque type de la hiérarchie d'héritage.

Dans cette procédure pas à pas, nous allons mapper les entités Course (type de base), OnlineCourse (dérive de Course) et OnsiteCourse (dérive des entités Course) aux tables portant les mêmes noms. Nous allons créer un modèle à partir de la base de données, puis modifier le modèle pour implémenter l’héritage TPT.

Vous pouvez également commencer par le Premier Modèle, puis générer la base de données à partir du modèle. Le concepteur EF utilise la stratégie TPT par défaut et donc tout héritage dans le modèle sera mappé à des tables distinctes.

Autres options d'héritage

TPH (table par hiérarchie) est un autre type d’héritage dans lequel une table de base de données pour gérer les données de tous les types d'entités d'une hiérarchie d'héritage.  Pour plus d’informations sur la façon de mapper l’héritage table par hiérarchie avec le Concepteur d’entités, consultez 'héritage TPH EF Designer

Notez que, l’héritage de type table par béton (TPC) et les modèles d’héritage mixte sont pris en charge par le runtime Entity Framework, mais ne sont pas pris en charge par ef Designer. Si vous souhaitez utiliser TPC ou l’héritage mixte, vous avez deux options : utiliser Code First ou modifier manuellement le fichier EDMX. Si vous choisissez d’utiliser le fichier EDMX, la fenêtre Détails du mappage est placée en “mode sans échec” et vous ne pourrez pas utiliser le concepteur pour modifier les mappages.

Prérequis

Pour exécuter ce processus pas à pas, vous devez :

Configurer le projet

  • Ouvrez Visual Studio 2012.
  • Sélectionnez Fichier>, Nouveau, puis >Projet
  • Dans le volet gauche, cliquez sur Visual C#, puis sélectionnez le modèle Console.
  • Entrez TPTDBFirstSample comme nom.
  • Sélectionnez OK.

Créer un modèle

  • Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis sélectionnez Ajouter >> Nouvel élément.
  • Sélectionnez Données dans le menu de gauche, puis sélectionnez ADO.NET Entity Data Model dans le menu des Modèles.
  • Entrez TPTModel.edmx comme nom de fichier, puis cliquez sur Ajouter.
  • Dans la boîte de dialogue Choisir le contenu du Model, sélectionnez** Générer à partir de la base de données**, puis cliquez sur Suivant.
  • Cliquer sur Nouvelle connexion. Dans la boîte de dialogue Propriétés de connexion, entrez le nom du serveur (par exemple, (localdb)\mssqllocaldb), sélectionnez la méthode d'authentification, tapez School comme nom de base de données, puis cliquez sur OK. La boîte de dialogue Choisir votre connexion de données est mise à jour avec vos paramètres de connexion à la base de données.
  • Dans la boîte de dialogue Choisir vos objets de base de données, sous le nœud Tables, sélectionnez les tables Department, Course, OnlineCourse et OnsiteCourse .
  • Cliquez sur Terminer.

Le Concepteur d'entités, qui fournit une aire de conception permettant de modifier votre modèle, est affiché. Tous les objets que vous avez sélectionnés dans la boîte de dialogue Choisir vos objets de base de données sont ajoutés au modèle.

Implémenter l'héritage TPT (table par type)

  • Sur la surface de conception, cliquez avec le bouton droit sur le type d’entité OnlineCourse, puis sélectionnez Propriétés.
  • Dans la fenêtre Propriétés, affectez la valeur Course à la propriété Type de base.
  • Cliquez avec le bouton droit sur le type d'entité OnsiteCourse, puis sélectionnez Propriétés.
  • Dans la fenêtre Propriétés, affectez la valeur Course à la propriété Type de base.
  • Cliquez avec le bouton droit sur l'association (la ligne) entre les types d'entités OnlineCourse et Course. Sélectionnez Supprimer du modèle.
  • Cliquez avec le bouton droit sur l'association entre les types d'entités OnsiteCourse et Course. Sélectionnez Supprimer du modèle.

Nous allons maintenant supprimer la propriété CourseID de OnlineCourse et OnsiteCourse, car ces classes héritent CourseID du type de base Course .

  • Cliquez avec le bouton droit sur la propriété CourseID du type d’entité OnlineCourse, puis sélectionnez Supprimer du modèle.
  • Cliquez avec le bouton droit sur la propriété CourseID du type d’entité OnsiteCourse, puis sélectionnez Supprimer du modèle
  • L'héritage TPT (table par type) est maintenant implémenté.

Table Per Type

Utiliser le Modèle

Ouvrez le fichier Program.cs où la méthode Main est définie. Collez le code suivant dans votre fonction Main. Le code exécute trois requêtes. La première requête renvoie tous les Courses liés au service spécifié. La deuxième requête utilise la méthode OfType pour renvoyer OnlineCourses liés au service spécifié. La troisième requête retourne 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);
            }
        }
    }