Share via


Procédure pas à pas : mappage d'une entité à plusieurs tables

Cette rubrique montre comment mapper un type d'entité à deux tables en modifiant le modèle conceptuel dans un modèle EDM (Entity Data Model). Vous pouvez mapper une entité à plusieurs tables quand les tables partagent une clé commune. Les concepts qui s'appliquent au mappage d'un type d'entité à deux tables sont facilement étendus au mappage d'un type d'entité à plusieurs tables. Pour plus d'informations sur le mappage d'une entité à plusieurs tables, voir Procédure : définir un modèle avec une même entité mappée à deux tables.

Dans cette procédure pas à pas, vous allez mapper un type d'entité à deux tables en modifiant le modèle EDM (Entity Data Model) utilisé dans l'application CourseManager (pour plus d'informations, voir la section Composants requis, plus loin dans cette rubrique). Vous allez créer un nouveau type d'entité (Instructor, dérivé du type d'entité Person ) et le mapper aux tables Person et OfficeAssignment. Les étapes suivantes récapitulent le processus (vous trouverez plus de détails dans les procédures fournies plus loin dans ce document) :

  1. Créez un nouveau type d'entité, Instructor.

  2. Affectez Person comme type de base pour Instructor.

    NoteRemarque

    Il n'est pas nécessaire de créer une hiérarchie d'héritage pour mapper un type d'entité à plusieurs tables. Une hiérarchie d'héritage est utilisée dans cet exemple pour le rendre plus réaliste (dans une école, seul l'enseignant aurait une attribution de lieu de travail). Il serait possible de mapper le type d'entité Person aux deux tables Person et OfficeAssignment sans créer un type d'entité Instructor.

  3. Déplacez la propriété HireDate de Person vers Instructor.

  4. Déplacez la propriété Location de OfficeAssignment vers Instructor.

  5. Mappez l'entité Instructor à la table Person avec la condition HireDate Is Not Null. Mappez la colonne HireDate à la propriété HireDate.

  6. Mappez l'entité Instructor à la table OfficeAssignment sans condition. Mappez la colonne InstructorID à la propriété PersonID et la colonne Location à la propriété Location.

  7. Supprimez le type d'entité OfficeAssignment.

Configuration requise

Pour effectuer cette procédure pas à pas, vous devez tout d'abord créer l'application CourseManager. Pour plus d'informations, voir le Démarrage rapide d'Entity Framework. Vous allez modifier le modèle EDM utilisé dans l'application CourseManager en ajoutant un nouveau type d'entité et le mappant à deux tables. Vous étendrez ensuite les fonctionnalités de l'application pour afficher les attributions de lieux de travail des enseignants.

NoteRemarque

Étant donné qu'un grand nombre des rubriques de procédure pas à pas de cette documentation utilisent l'application CourseManager comme point de départ, nous vous recommandons d'utiliser une copie de l'application CourseManager pour cette procédure pas à pas, plutôt que de modifier le code CourseManager d'origine.

Cette procédure pas à pas suppose que le lecteur a des compétences de base avec Visual Studio, le .NET Framework et la programmation à l'aide de Visual C# ou de Visual Basic.

Mappage d'une entité à deux tables

Dans cette procédure, vous allez modifier la partie conceptuelle du modèle EDM SchoolModel en créant un nouveau type d'entité (Instructor) et en le mappant à deux tables (Person et OfficeAssignment).

Pour mapper une entité à deux tables

  1. Ouvrez la solution CourseManager dans Visual Studio.

  2. Dans l'Explorateur de solutions, double-cliquez sur le fichier School.edmx.

    Le fichier School.edmx s'ouvre dans Entity Data Model Designer (Concepteur d'entités).

  3. Cliquez avec le bouton droit sur une zone vide de l'aire de conception du Concepteur d'entités, pointez sur Ajouter, puis cliquez sur Entité.

    La boîte de dialogue Nouvelle entité s'affiche.

  4. Tapez Instructor comme Nom du Entity, puis sélectionnez Person dans la liste déroulante correspondant au Type de base.

  5. Cliquez sur OK.

    Un nouveau type d'entité est créé et affiché sur l'aire de conception.

  6. Cliquez avec le bouton droit sur la propriété HireDate (sous Propriétés scalaires) du type d'entité Person, puis sélectionnez Couper.

  7. Cliquez avec le bouton droit sur Propriétés scalaires du type d'entité Instructor, puis sélectionnez Coller.

  8. Cliquez avec le bouton droit sur la propriété HireDate, puis sélectionnez Propriétés.

    La fenêtre Propriétés s'affiche.

  9. Dans la fenêtre Propriétés, affectez à la propriété Nullable la valeur false.

  10. Cliquez avec le bouton droit sur la propriété Location du type d'entité OfficeAssignment, puis sélectionnez Couper.

  11. Cliquez avec le bouton droit sur Propriétés scalaires du type d'entité Instructor, puis sélectionnez Coller.

  12. Cliquez avec le bouton droit sur la propriété Location, puis sélectionnez Propriétés.

  13. Dans la fenêtre Propriétés, affectez à la propriété Nullable la valeur false.

  14. Répétez des étapes 10 à 13 pour la propriété Timestamp du type OfficeAssignment.

    NoteRemarque

    Les étapes suivantes requièrent la fenêtre Détails de Mapping. Si cette fenêtre n'est pas visible, cliquez avec le bouton droit sur l'aire de conception, puis sélectionnez Détails de Mapping.

  15. Sélectionnez le type d'entité Instructor, puis cliquez sur <Ajouter une table ou une vue> dans la fenêtre Détails de Mapping.

    Le champ <Ajouter une table ou une vue> devient une liste déroulante de tables ou de vues auxquelles l'entité sélectionnée peut être mappée.

  16. Sélectionnez Person dans la liste déroulante.

    La fenêtre Détails de Mapping est mise à jour avec les mappages de colonnes par défaut et une option permettant l'ajout d'une condition.

  17. Cliquez sur <Ajouter un Condition>.

    Le champ <Ajouter un Condition> devient une liste déroulante des colonnes pour lesquelles des conditions peuvent être définies.

  18. Sélectionnez HireDate dans la liste déroulante.

  19. Dans la colonne Opérateur de la fenêtre Détails de Mapping, sélectionnez Is dans la liste déroulante.

  20. Dans la colonne Propriété/Valeur de la fenêtre Détails de Mapping, sélectionnez Non Null.

  21. Cliquez sur <Ajouter une table ou une vue>, puis sélectionnez OfficeAssignment dans la liste déroulante.

    La fenêtre Détails de Mapping est mise à jour avec les mappages de colonnes par défaut.

  22. Cliquez sur le champ Propriété/Valeur que correspond à la colonne InstructorID, puis sélectionnez PersonID dans la liste déroulante.

  23. Cliquez avec le bouton droit sur le type d'entité OfficeAssignment, puis sélectionnez Supprimer.

Le type d'entité Instructor est maintenant mappé aux tables Person et OfficeAssignment.

Création de l'interface utilisateur

Ensuite, vous allez ajouter un bouton au formulaire CourseViewer que charge et affiche le formulaire CourseAssignmentForm. Ensuite, vous ajouterez un contrôle DataGridView au formulaire pour afficher des lieux de travail de Instructor. Enfin, vous ajouterez un bouton au formulaire CourseAssignmentForm qui enregistre les mises à jour de la base de données.

Pour créer l'interface utilisateur

  1. Cliquez avec le bouton droit sur le projet CourseManager dans l'Explorateur de solutions, pointez sur Ajouter, puis sélectionnez Nouvel élément.

    La boîte de dialogue Ajouter un nouvel élément s'affiche.

  2. Sélectionnez Windows Form, définissez OfficeAssignment.vb ou OfficeAssignment.cs comme nom du formulaire, puis cliquez sur Ajoutez.

    Un nouveau formulaire est ajouté au projet et s'ouvre dans le concepteur de formulaires. Le nom du formulaire a la valeur OfficeAssignment et le texte a la valeur OfficeAssignment.

  3. Faites glisser un contrôle DataGridView vers le formulaire, puis affectez-lui officeGridView comme nom.

  4. Cliquez sur la balise active du DataGridView, et désactivez les options Activer l'ajout et Activer la suppression.

  5. Faites glisser un contrôle Button vers le formulaire, et affectez saveChanges à sa propriété de nom et Update à sa propriété de texte.

  6. Dans l'Explorateur de solutions, double-cliquez sur CourseViewer.cs ou sur CourseViewer.vb.

    Le mode Création du formulaire CourseViewer apparaît.

  7. Faites glisser un contrôle Button de la boîte à outils vers le formulaire CourseViewer.

  8. Dans la fenêtre Propriétés, définissez viewOffices comme nom du bouton et définissez View Offices comme texte du bouton.

  9. Double-cliquez sur l'objet ButtonviewOffices.

    Le fichier code-behind du formulaire CourseViewer s'ouvre.

  10. Ajoutez le code suivant au gestionnaire d'événements viewOffices_click :

    Dim officeForm As New OfficeAssignment()
    officeForm.Visible = True
    
    OfficeAssignment officeForm = new OfficeAssignment();
    officeForm.Visible = true;
    

L'interface utilisateur pour ce formulaire est maintenant terminée.

Interrogation du modèle EDM

Cette application affiche des données en liant un contrôle DataGridView au modèle EDM SchoolModel. Les informations affichées dans le contrôle DataGridView peuvent être modifiées et les modifications peuvent être enregistrées dans la base de données. Pour plus d'informations sur la liaison d'objets à des contrôles, voir Liaison d'objets à des contrôles (Entity Framework).

Pour interroger le modèle EDM

  1. Le formulaire OfficeAssignment étant ouvert dans le concepteur de formulaires, double-cliquez sur le corps du rapport.

    Le fichier code-behind du formulaire OfficeAssignment s'ouvre.

  2. Ajoutez les instructions using (C#) ou Imports (Visual Basic) ci-après pour faire référence au modèle créé à partir de la base de données School et à l'espace de noms de l'entité.

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. Ajoutez une propriété représentant un contexte de données à la classe OfficeAssignment :

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. Dans le gestionnaire d'événements OfficeAssignment_Load, ajoutez du code pour initialiser le contexte de l'objet et lier le contrôle DataGridView à une requête qui retourne les informations relatives à Instructor.

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Get Persons of type Instructor.
    Dim instructorQuery As ObjectQuery(Of Instructor) = _
        schoolContext.Person.OfType(Of Instructor)()
    
    ' Bind the query results to the GridView control.
    ' Display only location and name.
    officeGridView.DataSource = instructorQuery _
        .Execute(MergeOption.OverwriteChanges)
    officeGridView.Columns("HireDate").Visible = False
    officeGridView.Columns("PersonID").Visible = False
    officeGridView.Columns("Timestamp").Visible = False
    officeGridView.Columns("EnrollmentDate").Visible = False
    
    schoolContext = new SchoolEntities();
    
    // Get Persons of type Instructor.
    ObjectQuery<Instructor> instructorQuery = schoolContext
        .Person.OfType<Instructor>();
    
    // Bind the query results to the GridView control.
    // Display only location and name.
    officeGridView.DataSource = instructorQuery
        .Execute(MergeOption.OverwriteChanges);
    officeGridView.Columns["HireDate"].Visible = false;
    officeGridView.Columns["Timestamp"].Visible = false;
    officeGridView.Columns["PersonID"].Visible = false;
    officeGridView.Columns["EnrollmentDate"].Visible = false;
    
  5. Repassez en mode création du formulaire OfficeAssignment, puis double-cliquez sur le contrôle ButtonsaveChanges.

    Le gestionnaire d'événements saveChanges_Click est créé dans le fichier code-behind.

  6. Ajoutez du code au gestionnaire d'événements pour enregistrer toutes les modifications qui ont été apportées au contrôle DataGridView dans la base de données.

    Dim numChanges As Integer
    
    ' Save object changes to the database, display a message,
    ' and refresh the form.
    numChanges = schoolContext.SaveChanges()
    MessageBox.Show(numChanges.ToString() + _
                    " change(s) saved to the database.")
    Me.Refresh()
    
    int numChanges;
    // Save object changes to the database, display a message,
    // and refresh the form.
    numChanges = schoolContext.SaveChanges();
    MessageBox.Show(numChanges.ToString() +
        " change(s) saved to the database.");
    this.Refresh();
    

L'application est maintenant terminée. Appuyez sur Ctrl+F5 pour l'exécuter. Cliquez sur le bouton View Offices pour charger le formulaire OfficeAssignments. Le nom des enseignants et les lieux de travail sont affichés. Les informations affichées peuvent être modifiées et vous pouvez enregistrer les modifications dans la base de données en cliquant sur le bouton Update.

Liste de codes

Cette section répertorie la version finale du fichier code-behind pour le formulaire OfficeAssignmentForm.

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class OfficeAssignment
    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Private Sub OfficeAssignment_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Initialize the ObjectContext.
        schoolContext = New SchoolEntities()

        ' Get Persons of type Instructor.
        Dim instructorQuery As ObjectQuery(Of Instructor) = _
            schoolContext.Person.OfType(Of Instructor)()

        ' Bind the query results to the GridView control.
        ' Display only location and name.
        officeGridView.DataSource = instructorQuery _
            .Execute(MergeOption.OverwriteChanges)
        officeGridView.Columns("HireDate").Visible = False
        officeGridView.Columns("PersonID").Visible = False
        officeGridView.Columns("Timestamp").Visible = False
        officeGridView.Columns("EnrollmentDate").Visible = False
    End Sub

    Private Sub saveChanges_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles saveChanges.Click
        Dim numChanges As Integer

        ' Save object changes to the database, display a message,
        ' and refresh the form.
        numChanges = schoolContext.SaveChanges()
        MessageBox.Show(numChanges.ToString() + _
                        " change(s) saved to the database.")
        Me.Refresh()
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class OfficeAssignment : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public OfficeAssignment()
        {
            InitializeComponent();
        }

        private void OfficeAssignment_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();

            // Get Persons of type Instructor.
            ObjectQuery<Instructor> instructorQuery = schoolContext
                .Person.OfType<Instructor>();

            // Bind the query results to the GridView control.
            // Display only location and name.
            officeGridView.DataSource = instructorQuery
                .Execute(MergeOption.OverwriteChanges);
            officeGridView.Columns["HireDate"].Visible = false;
            officeGridView.Columns["Timestamp"].Visible = false;
            officeGridView.Columns["PersonID"].Visible = false;
            officeGridView.Columns["EnrollmentDate"].Visible = false;
        }

        private void saveChanges_Click(object sender, EventArgs e)
        {
            int numChanges;
            // Save object changes to the database, display a message,
            // and refresh the form.
            numChanges = schoolContext.SaveChanges();
            MessageBox.Show(numChanges.ToString() +
                " change(s) saved to the database.");
            this.Refresh();
        }
    }
}

Étapes suivantes

Vous avez mappé avec succès une entité à plusieurs tables. Pour plus d'informations sur la création d'un modèle avec une entité mappée à plusieurs tables, voir Procédure : définir un modèle avec une même entité mappée à deux tables. Pour plus d'informations sur la création d'applications qui utilisent Entity Framework, voir Guide de programmation (Entity Framework).

Voir aussi

Autres ressources

Scénarios ADO.NET Entity Data Model Designer
Tâches des outils Entity Data Model