Partager via


Procédure : créer et exécuter des requêtes d'objet à l'aide de l'héritage TPT (table par type) (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 TPT (table par type)

  1. Créez un projet d'application console nommé SchoolDataClient 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 de la hiérarchie d'héritage décrite dans la rubrique Procédure : définir un modèle avec l'héritage TPT (table par type) (Entity Framework).

  3. Ajoutez les schémas du projet d'héritage dans le même dossier que l'exécutable de SchoolDataClient.

  4. Ajoutez au projet un fichier de configuration d'application avec le contenu 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 les données correspondant à tous les départements du système.

Une boucle foreach sur le type de base Department affichera les données correspondant aux types DeptBusiness, DeptEngineering et DeptMusic dérivés du type Department.

La deuxième boucle foreach montre comment obtenir uniquement les écoles d'ingénieurs de la collection Departments.

L'opérateur OfType permet le filtrage de valeurs d'une source basée sur le type.

La collection Departments contient les départements d'ingénierie, de commerce et de musique, mais la spécification générique retourne uniquement ceux du type spécifié entre les crochets pointus.

Option Strict On
Option Explicit On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml
Imports System.Xml.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 contact reference if any.
                    dept.AdministratorReference.Load()
                    If dept.Administrator IsNot Nothing Then
                        Console.WriteLine("Administrator: {0} {1}", _
                            dept.Administrator.FirstName, _
                            dept.Administrator.LastName)
                    End If
                Next

                For Each eDept As DeptEngineering In _
                        objectContext.Departments.OfType(Of DeptEngineering)()
                    Console.WriteLine("{0} LabBudget: {1} FiberOp Budget: {2}", _
                        eDept.Name, eDept.LabBudget.ToString(), _
                        eDept.FiberOpticsBudget.ToString())
                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;

namespace SchoolDataTPTClient
{
    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 contact reference if any.
                        dept.AdministratorReference.Load();
                        if (null != dept.Administrator)
                            Console.WriteLine("Administrator: {0} {1}",
                                         dept.Administrator.FirstName,
                                         dept.Administrator.LastName);
                    }

                    foreach (DeptEngineering eDept in
                        objectContext.Departments.OfType<DeptEngineering>())
                        Console.WriteLine("{0} LabBudget: {1} FiberOp Budget: {2}",
                            eDept.Name, eDept.LabBudget.ToString(), 
                            eDept.FiberOpticsBudget.ToString());
                    }

                }

            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 TPT (table par type) (Entity Framework)