Partager via


Procédure : créer et exécuter des requêtes d'objet à l'aide de l'héritage TPH (table par hiérarchie) (Entity Framework)

L'héritage dans le modèle EDM (Modèle de données d'entité) présente les mêmes avantages de l'héritage que ceux qui s'appliquent dans la programmation orientée objet. Les instances de types dans la hiérarchie peuvent être traitées ensemble ou en tant qu'instances de l'un des sous-types. Tous les sous-types héritent des propriétés du type de base et les propriétés supplémentaires implémentées par les sous-types sont accessibles en fonction des besoins.

Pour créer le projet à l'aide de l'héritage TPH (table par hiérarchie)

  1. Créez un projet d'application console et ajoutez des références à System.Data.Entity et à System.Runtime.Serialization.

  2. Ajoutez une référence à la DLL générée à partir du modèle d'héritage de la rubrique Procédure : définir un modèle avec l'héritage TPH (table par hiérarchie) (Entity Framework).

  3. Ajoutez les schémas de la rubrique Procédure : définir un modèle avec l'héritage TPH (table par hiérarchie) (Entity Framework) au dossier dans lequel se trouve l'exécutable.

  4. Ajoutez un fichier de configuration d'application avec le contenu de l'exemple suivant.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings><add name="SchoolDataLibContainer" 
   connectionString=
   "metadata=res://*/SchoolDataLib.csdl|
   res://*/SchoolDataLib.ssdl|
   res://*/SchoolDataLib.msl;provider=System.Data.SqlClient;
   provider connection string=&quot;
   Data Source=localhost;
   Initial Catalog=SchoolData;Integrated Security=True;
   MultipleActiveResultSets=True&quot;" 
   providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

Exemple

Le code suivant affiche toutes les instances de types de la hiérarchie dans une boucle foreach qui énumère les instances de types de la collection People sur l'objet ObjectContext de SchoolDataEntities.

Le type de chaque instance est affiché par un appel à la méthode GetType.

La deuxième boucle foreach utilise le filtre OfType sur la collection People pour retourner uniquement les instances de type Instructor.

Seul le type Instructor contient la propriété HireDate. Le code affiche HireDate avec les prénom et nom des enseignants retournés par la requête.

Option Strict On
Option Explicit On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports SchoolDataLib

Module Module1

    Sub Main()
        Try
            Using objectContext As SchoolDataLibContainer = New SchoolDataLibContainer()
                ' Display departments and administrators.
                For Each dept As Department In objectContext.Departments
                    Console.WriteLine("School: {0} Budget: {1}", _
                        dept.Name, dept.Budget)

                    ' Load associated person reference.
                    dept.AdministratorReference.Load()
                    If dept.Administrator IsNot Nothing Then
                        Console.WriteLine("Administrator: {0} {1}", _
                            dept.Administrator.FirstName, _
                            dept.Administrator.LastName)
                    End If

                    For Each student As Student In objectContext.People.OfType(Of Student)()
                        Console.WriteLine("Student: {0} {1}", student.FirstName, _
                            student.LastName)
                    Next

                    For Each person As Person In objectContext.People
                        Console.WriteLine("{0} Name: {1}", _
                            person.GetType().Name, person.LastName)
                    Next

                    For Each instructor In objectContext.People. _
                            OfType(Of Instructor)()
                        Console.WriteLine("Instructor: {0} {1} Hire Date: {2}", _
                            instructor.FirstName, _
                            instructor.LastName, _
                            instructor.HireDate)
                    Next

                Next
            End Using

        Catch ex As System.Data.MappingException
            Console.WriteLine(ex.ToString())
        Catch ex As System.Data.UpdateException
            Console.WriteLine(ex.ToString())
        End Try
    End Sub

End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SchoolDataLib;
using System.Data.Objects;

namespace SchoolDataClient
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (SchoolDataLibContainer objectContext =
                                      new SchoolDataLibContainer ())
                {
                    // Display departments and administrators.
                    foreach (Department dept in objectContext.Departments)
                    {
                        Console.WriteLine("School: {0} Budget: {1}",
                            dept.Name,
                            dept.Budget);

                        // Load associated person reference.
                        dept.AdministratorReference.Load();
                        if (null != dept.Administrator)
                            Console.WriteLine("Administrator: {0} {1}",
                                         dept.Administrator.FirstName,
                                         dept.Administrator.LastName);
                    }

                    foreach (Student student in
                        objectContext.People.OfType<Student>())
                    {
                        Console.WriteLine("Student: {0} {1}", student.FirstName,
                            student.LastName);

                    }

                    
                    foreach (Person person in objectContext.People)
                        Console.WriteLine("{0} Name: {1}",
                            person.GetType().Name,
                            person.LastName);

                    foreach (Instructor instructor in
                        objectContext.People.OfType<Instructor>())
                        Console.WriteLine("Instructor: {0} {1} Hire Date: {2}",
                            instructor.FirstName,
                            instructor.LastName,
                            instructor.HireDate);

                    objectContext.Connection.Close();
                }
            }

            catch (System.Data.MappingException e)
            {
                Console.WriteLine(e.ToString());
            }
            catch (System.Data.UpdateException e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

Voir aussi

Tâches

Procédure : définir un modèle avec l'héritage TPH (table par hiérarchie) (Entity Framework)

Concepts

Héritage (EDM)