Partager via


Procédure pas à pas : ajout des entités à l'aide de propriétés de clé étrangère (Entity Framework)

Cette rubrique décrit comment générer un modèle conceptuel avec des clés étrangères exposées comme propriétés d'entité et comment écrire le code pour la création des entités et des relations.

À partir de Visual Studio 2010, lorsque vous générez un modèle d'une base de données existante, ADO.NET Entity Data Model Designer (Concepteur d'entités) crée des propriétés scalaires sur les types d'entité qui correspondent aux colonnes de clés étrangères dans la base de données. Les propriétés de clé étrangère peuvent être utilisées pour créer et modifier des relations entre des types d'entité. Par défaut, le Concepteur d'entités génère également des propriétés de navigation sur les types d'entité qui peuvent être utilisés pour créer et modifier des relations. Cette procédure pas à pas montre comment créer des relations à l'aide des propriétés de clé étrangère et des propriétés de navigation. La création et la gestion de relations à l'aide des propriétés de clé étrangère simplifient de nombreux scénarios courants. Par exemple, la liaison de données, le contrôle concurrentiel et les scénarios multicouche peuvent être rendus plus simples en utilisant des propriétés de clé étrangère pour créer et gérer des relations. Pour plus d'informations, consultez Defining and Managing Relationships.

Configuration requise

Pour compléter cette procédure pas à pas, vous devez avoir Visual Studio 2010 ou une version ultérieure installée sur votre ordinateur et vous devez avoir accès à une instance SQL Server qui contient l'exemple de base de données School. Pour plus d'informations, consultez Creating the School Sample Database.

Cette procédure pas à pas suppose que vous possédez des compétences de base avec Visual Studio, .NET Framework et la programmation en Visual C# ou Visual Basic.

Génération du fichier .edmx

Pour compléter cette procédure, vous devez avoir un nouveau projet d'application WPF ouvert dans Visual Studio. Dans cette procédure, vous générerez un fichier .edmx à partir de deux tables dans l'exemple de base de données School. Un fichier .edmx contient un modèle conceptuel, un modèle de stockage et le mappage entre les deux. Pour plus d'informations, consultez Présentation d'un fichier .edmx (Entity Framework). Les types d'entité dans le modèle conceptuel généré possèdent des propriétés scalaires qui correspondent aux colonnes de clés étrangères dans la base de données.

Pour générer le fichier .edmx

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, pointez sur Ajouter, puis sélectionnez Nouvel élément.

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

  2. Sélectionnez ADO.NET Entity Data Model et cliquez Ajoutez. (Pour réduire le nombre de modèles visibles, choisissez Données sous Modèles installés.)

  3. Dans l'Assistant EDM, sélectionnez Générer à partir de la base de données, puis cliquez sur Suivant.

  4. Dans la boîte de dialogue Choisir votre connexion de données, connectez-vous à l'exemple de base de données School et cliquez sur Suivant.

  5. Dans la boîte de dialogue Choisir vos objets de base de donnée, développez le nœud Tables et sélectionnez les tables Course et Department. Notez que les cases à cocher Mettre au pluriel ou au singulier les noms d'objets générés et Inclure les colonnes clés étrangères dans le modèle sont activées par défaut. Si vous laissez la case à cocher Inclure les colonnes clés étrangères dans le modèle activée, vous créez des propriétés scalaires sur les types d'entité mappés aux colonnes de clés étrangères et des associations de clé étrangère sont créées entre les entités. La désactivation de cette case à cocher crée des associations indépendantes entre les types d'entité. Pour plus d'informations, consultez Association Element (CSDL) et ReferentialConstraint Element (CSDL).

    Si vous laissez la case à cocher Mettre au pluriel ou au singulier les noms d'objets générés activée, vous appliquez des règles de langue anglaise pour les pluriels et les singuliers aux noms de jeu d'entités, de type d'entité et de propriété de navigation. Pour plus d'informations, consultez Boîte de dialogue Choisir vos objets de base de données (Assistant EDM).

    Cette procédure pas à pas suppose que vous continuiez avec les deux cases à cocher activées.

  6. Cliquez sur Terminer.

    Un fichier .edmx est ajouté à votre projet et s'affiche dans le Concepteur d'entités. L'affichage présente deux types d'entité (Department et Course) avec une association un-à-plusieurs (1: *) entre eux. L'association est créée à l'aide d'une contrainte référentielle et peut être affichée en ouvrant le fichier .edmx dans l'Éditeur XML :

    <Association Name="FK_Course_Department">
      <End Role="Department" Type="SchoolModel.Department" Multiplicity="1" />
      <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
      <ReferentialConstraint>
        <Principal Role="Department">
          <PropertyRef Name="DepartmentID" />
        </Principal>
        <Dependent Role="Course">
          <PropertyRef Name="DepartmentID" />
        </Dependent>
      </ReferentialConstraint>
    </Association>
    

    Pour plus d'informations, consultez ReferentialConstraint Element (CSDL).

Création de l'interface utilisateur

Dans cette procédure, vous allez ajouter des contrôles à votre application qui vous permettent de créer et de mettre à jour les informations sur les services et les cours.

Pour créer l'interface utilisateur

  1. Dans le menu Données de Visual Studio, sélectionnez Afficher les sources de données.

    Le volet Sources de données s'affiche.

  2. Cliquez sur l'onglet MainWindow.xaml pour afficher l'aire de conception MainWindow.

  3. Dans le volet Sources de données, cliquez sur la source de données Cours et sélectionnez Détails dans la liste déroulante.

  4. Répétez l'étape deux pour la source de données Services.

  5. Dans le volet Sources de données, développez la source de données Courses, cliquez sur le champ DepartmentID et sélectionnez Aucun.

  6. Dans le volet Sources de données, développez la source de données Departments, cliquez sur le champ Name et sélectionnez ComboBox.

  7. Faites glisser les sources de données Departments et Courses sur l'aire de conception MainWindow.

    Les contrôles Grid pour les sources de données Courses et Departments sont créés sur l'aire de conception MainWindow.

  8. Désactivez la case à cocher IsEnabled dans la fenêtre Propriétés pour les zones de texte Department ID, Budget, Start Date et Administrator.

  9. Activez la case à cocher IsEditable dans la fenêtre Propriétés de la zone de liste déroulante Name.

  10. Dans la boîte à outils, faites glisser un contrôle Checkbox sur l'aire de conception MainWindow. Modifiez le nom du contrôle Checkbox en newDepartment et définissez sa propriété Content sur New Department.

  11. Dans la boîte à outils, faites glisser un contrôle Button sur l'aire de conception MainWindow. Modifiez le nom du contrôle Button en addWithFKButtonet modifiez sa propriété Content en Add (FK).

  12. Dans la boîte à outils, faites glisser un contrôle Button sur l'aire de conception MainWindow. Modifiez le nom du contrôle Button en addWithNavPropButton et modifiez sa propriété Content en Add (Nav Prop).

L'interface utilisateur est maintenant terminée.

Ajout d'entités associées à l'aide de propriétés de clé étrangère

Dans cette procédure vous ajouterez le code à votre application qui vous permettra d'ajouter de nouveaux cours et services à l'aide des propriétés de clé étrangère.

Pour ajouter des entités associées à l'aide des propriétés de clé étrangère

  1. Ouvrez MainWindow.xaml.vb ou le fichier MainWindow.xaml.cs et ajoutez l'instruction Using (C#) ou Imports (Visual Basic) suivante :

    Imports System.Data.Objects
    
    using System.Data.Objects;
    
  2. Ajoutez le membre suivant à la classe MainWindow. Il s'agit du ObjectContext auquel vous ajouterez des objets.

    Private context As SchoolEntities
    
    private SchoolEntities context;
    
  3. Remplacez le code dans la méthode Window_Loaded par le code suivant qui permet de remplir un contrôle GridView avec des services :

    context = New SchoolEntities()
    Dim departmentsViewSource As CollectionViewSource = _
        DirectCast((Me.FindResource("DepartmentsViewSource")),  _
            CollectionViewSource)
    Dim departmentsQuery As ObjectQuery(Of Department) = _
        Me.GetDepartmentsQuery(context)
    departmentsViewSource.Source = _
        departmentsQuery.Execute(MergeOption.AppendOnly)
    
    context = new SchoolEntities();
    CollectionViewSource departmentsViewSource =
        ((CollectionViewSource)(this.FindResource("departmentsViewSource")));
    ObjectQuery<Department> departmentsQuery =
          this.GetDepartmentsQuery(context);
    departmentsViewSource.Source =
        departmentsQuery.Execute(MergeOption.AppendOnly);
    
  4. Sur l'aire de conception MainWindow, double-cliquez sur le bouton New Department.

    La méthode newDepartment_Checked est ajoutée au fichier code-behind.

  5. Ajoutez le code suivant à la méthode newDepartment_Checked. Cela vous permettra d'ajouter un nouveau service au ObjectContext.

    Dim departmentsViewSource As CollectionViewSource = _
        DirectCast((FindResource("DepartmentsViewSource")),  _
            CollectionViewSource)
    If newDepartment.IsChecked = True Then
        departmentsViewSource.Source = Nothing
        DepartmentIDTextBox.IsEnabled = True
        BudgetTextBox.IsEnabled = True
        StartDateDatePicker.IsEnabled = True
        AdministratorTextBox.IsEnabled = True
    End If
    
    CollectionViewSource departmentsViewSource =
        (CollectionViewSource)(FindResource("departmentsViewSource"));
    if (newDepartment.IsChecked == true)
    {
        departmentsViewSource.Source = null;
        departmentIDTextBox.IsEnabled = true;
        budgetTextBox.IsEnabled = true;
        startDateDatePicker.IsEnabled = true;
        administratorTextBox.IsEnabled = true;
    }
    
  6. Sur l'aire de conception MainWindow, double-cliquez sur le bouton Add (FK).

    La méthode addWithFKButton_Click est ajoutée au fichier code-behind.

  7. Ajoutez le code suivant à la méthode addWithFKButton_Click. Notez qu'un nouveau cours est associé à un service en définissant la propriété DepartmentID du nouveau cours.

    If newDepartment.IsChecked = True Then
        Dim dept As New Department()
        dept.DepartmentID = Convert.ToInt32(DepartmentIDTextBox.Text)
        dept.Name = NameComboBox.Text
        dept.Budget = Convert.ToInt32(BudgetTextBox.Text)
        dept.StartDate = Convert.ToDateTime(StartDateDatePicker.SelectedDate)
        dept.Administrator = Convert.ToInt32(AdministratorTextBox.Text)
        context.Departments.AddObject(dept)
    End If
    
    Dim course As New Course()
    course.CourseID = Convert.ToInt32(CourseIDTextBox.Text)
    course.Title = TitleTextBox.Text
    course.Credits = Convert.ToInt32(CreditsTextBox.Text)
    ' The new course is associated with a department
    ' by setting the DepartmentID property.
    course.DepartmentID = Convert.ToInt32(DepartmentIDTextBox.Text)
    context.Courses.AddObject(course)
    context.SaveChanges()
    
    if (newDepartment.IsChecked == true)
    {
        Department dept = new Department
        {
            DepartmentID = Convert.ToInt32(departmentIDTextBox.Text),
            Name = nameComboBox.Text,
            Budget = Convert.ToInt32(budgetTextBox.Text),
            StartDate = Convert
                      .ToDateTime(startDateDatePicker.SelectedDate),
            Administrator = Convert
                      .ToInt32(administratorTextBox.Text)
        };
        context.Departments.AddObject(dept);
    }
    Course course = new Course
    {
        CourseID = Convert.ToInt32(courseIDTextBox.Text),
        Title = titleTextBox.Text,
        Credits = Convert.ToInt32(creditsTextBox.Text),
        // The new course is associated with a department
        // by setting the DepartmentID property.
        DepartmentID = Convert.ToInt32(departmentIDTextBox.Text)
    };
    context.Courses.AddObject(course);
    context.SaveChanges();
    
Ee828425.note(fr-fr,VS.100).gifRemarque :
Si vous ajoutez simultanément un nouveau cours et un nouveau service, leurs propriétés de navigation ne sont pas synchronisées tant que SaveChanges n'est pas appelé.Par exemple, si vous essayez d'accéder au nouveau service via la propriété de navigation du nouveau cours avant d'appeler SaveChanges, Null est retourné.

Appuyez sur Crtl+F5 pour exécuter le programme. Vous pouvez ajouter un nouveau cours au service sélectionné en modifiant les informations relatives aux cours et en cliquant sur Add (FK). Pour ajouter un nouveau cours à un nouveau service, activez la case à cocher New Department, modifiez les informations sur les cours et les services et cliquez sur Add (FK).

Ajout d'entités associées à l'aide des propriétés de navigation

Dans cette procédure vous ajouterez le code à votre application qui vous permet d'ajouter de nouveaux cours et services à l'aide des propriétés de navigation.

Titre de procédure

  1. Sur l'aire de conception MainWindow, double-cliquez sur le bouton Add (Nav Prop).

    La méthode addWithNavPropButton_Click est ajoutée au fichier code-behind.

  2. Ajoutez le code suivant à la méthode addWithNavPropButton_Click. Notez qu'un nouveau cours est associé à un service en définissant la propriété de navigation Department du nouveau cours. Cela ajoute également le nouveau cours au ObjectContext.

    Dim dept As Department
    If newDepartment.IsChecked = True Then
        dept = New Department()
        dept.DepartmentID = Convert.ToInt32(DepartmentIDTextBox.Text)
        dept.Name = NameComboBox.Text
        dept.Budget = Convert.ToInt32(BudgetTextBox.Text)
        dept.StartDate = Convert.ToDateTime(StartDateDatePicker.SelectedDate)
        dept.Administrator = Convert.ToInt32(AdministratorTextBox.Text)
        context.Departments.AddObject(dept)
    Else
        dept = DirectCast(NameComboBox.SelectedItem, Department)
    End If
    
    Dim course As New Course()
    course.CourseID = Convert.ToInt32(CourseIDTextBox.Text)
    course.Title = TitleTextBox.Text
    course.Credits = Convert.ToInt32(CreditsTextBox.Text)
    ' The new course is associated with a department
    ' by setting the Department navigation property.
    ' This also adds the new course to the context.
    course.Department = dept
    context.Courses.AddObject(course)
    context.SaveChanges()
    
    Department dept;
    if (newDepartment.IsChecked == true)
    {
        dept = new Department
        {
            DepartmentID = Convert.ToInt32(departmentIDTextBox.Text),
            Name = nameComboBox.Text,
            Budget = Convert.ToInt32(budgetTextBox.Text),
            StartDate = Convert
                        .ToDateTime(startDateDatePicker.SelectedDate),
            Administrator = Convert.ToInt32(administratorTextBox.Text)
        };
        context.Departments.AddObject(dept);
    }
    else
    {
        dept = (Department)nameComboBox.SelectedItem;
    }
    
    Course course = new Course
    {
        CourseID = Convert.ToInt32(courseIDTextBox.Text),
        Title = titleTextBox.Text,
        Credits = Convert.ToInt32(creditsTextBox.Text),
        // The new course is associated with a department
        // by setting the Department navigation property.
        // This also adds the new course to the context.
        Department = dept
    };
    context.SaveChanges();
    

Appuyez sur Crtl+F5 pour exécuter le programme. Vous pouvez ajouter un nouveau cours au service sélectionné en modifiant les informations relatives aux cours et en cliquant sur Add (Nav Prop). Pour ajouter un nouveau cours à un nouveau service, activez la case à cocher Nouveau service, modifiez les informations sur les cours et les services et cliquez sur Add (Nav Prop).

Voir aussi

Tâches

Procédure : créer un fichier .edmx (Entity Data Model Tools)

Autres ressources

Working with Foreign Keys (Entity Framework)