Définition d’une requête - Concepteur EF

Cette procédure pas à pas montre comment ajouter une requête de définition et un type d’entité correspondant à un modèle à l’aide du Concepteur EF. Une requête de définition est couramment utilisée pour fournir des fonctionnalités similaires à celles fournies par une vue de base de données, mais la vue est définie dans le modèle, et non dans la base de données. Une requête de définition vous permet d’exécuter une instruction SQL spécifiée dans l’élément DefiningQuery d’un fichier .edmx. Pour plus d’informations, consultez DefinitionQuery dans la spécification SSDL.

Lorsque vous utilisez la définition de requêtes, vous devez également définir un type d’entité dans votre modèle. Le type d’entité est utilisé pour surfacer les données exposées par la requête de définition. Notez que les données surfaces par le biais de ce type d’entité sont en lecture seule.

Les requêtes paramétrées ne peuvent pas être exécutées en tant que requêtes de définition. Toutefois, les données peuvent être mises à jour en mappant les fonctions d'insertion, de mise à jour et de suppression du type d'entité qui surface les données aux procédures stockées. Pour plus d’informations, consultez Insérer, mettre à jour et supprimer avec des procédures stockées.

Cette rubrique montre comment effectuer les tâches suivantes.

  • Ajouter une requête de définition
  • Ajouter un type d’entité au modèle
  • Mapper la requête de définition au type d’entité

Prérequis

Pour exécuter cette procédure pas à pas, vous avez besoin des éléments suivants :

Configurer le projet

Cette procédure pas à pas utilise Visual Studio 2012 ou une version ultérieure.

  • Ouvrez Visual Studio.
  • Dans le menu Fichier , pointez sur Nouveau, puis cliquez sur Projet.
  • Dans le volet gauche, cliquez sur Visual C#, puis sélectionnez le modèle d’application console .
  • Entrez DefiningQuerySample comme nom du projet, puis cliquez sur OK.

 

Créer un modèle en fonction de la base de données scolaire

  • Cliquez avec le bouton droit sur le nom du projet dans Explorateur de solutions, pointez sur Ajouter, puis cliquez sur Nouvel élément.

  • Sélectionnez Données dans le menu de gauche, puis ADO.NET modèle de données d’entité dans le volet Modèles.

  • Entrez DefiningQueryModel.edmx pour le nom du fichier, puis cliquez sur Ajouter.

  • Dans la boîte de dialogue Choisir le contenu du modèle, sélectionnez Générer à partir de la base de données, puis cliquez sur Suivant.

  • Cliquez 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 pour le nom de la base de données, puis cliquez sur OK. La boîte de dialogue Choisir votre connexion de données est mise à jour avec votre paramètre de connexion de base de données.

  • Dans la boîte de dialogue Choisir vos objets de base de données, cochez le nœud Tables . Cela ajoute toutes les tables au modèle Scolaire .

  • Cliquez sur Terminer.

  • Dans Explorateur de solutions, cliquez avec le bouton droit sur le fichier DefiningQueryModel.edmx, puis sélectionnez Ouvrir avec....

  • Sélectionnez l’éditeur XML (texte).

    Éditeur XML

  • Cliquez sur Oui si vous y êtes invité avec le message suivant :

    Avertissement 2

 

Ajouter une requête de définition

Dans cette étape, nous allons utiliser l’Éditeur XML pour ajouter une requête de définition et un type d’entité à la section SSDL du fichier .edmx. 

  • Ajoutez un élément EntitySet à la section SSDL du fichier .edmx (ligne 5 à 13). Spécifiez les éléments suivants :
    • Seuls les attributs Name et EntityType de l’élément EntitySet sont spécifiés.
    • Le nom complet du type d’entité est utilisé dans l’attribut EntityType .
    • L’instruction SQL à exécuter est spécifiée dans l’élément DefiningQuery .
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
        <EntityContainer Name="SchoolModelStoreContainer">
           <EntitySet Name="GradeReport" EntityType="SchoolModel.Store.GradeReport">
              <DefiningQuery>
                SELECT CourseID, Grade, FirstName, LastName
                FROM StudentGrade
                JOIN
                (SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
                ON StudentID = p.PersonID
              </DefiningQuery>
          </EntitySet>
          <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" />
  • Ajoutez l’élément EntityType à la section SSDL du .edmx. fichier comme indiqué ci-dessous. Notez les points suivants :
    • La valeur de l’attribut Name correspond à la valeur de l’attribut EntityType dans l’élément EntitySet ci-dessus, bien que le nom complet du type d’entité soit utilisé dans l’attribut EntityType .
    • Les noms de propriétés correspondent aux noms de colonnes retournés par l’instruction SQL dans l’élément DefiningQuery (ci-dessus).
    • Dans cet exemple, la clé d'entité est composée de trois propriétés pour garantir le caractère unique de la valeur de la clé.
    <EntityType Name="GradeReport">
      <Key>
        <PropertyRef Name="CourseID" />
        <PropertyRef Name="FirstName" />
        <PropertyRef Name="LastName" />
      </Key>
      <Property Name="CourseID"
                Type="int"
                Nullable="false" />
      <Property Name="Grade"
                Type="decimal"
                Precision="3"
                Scale="2" />
      <Property Name="FirstName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
      <Property Name="LastName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
    </EntityType>

Notes

Si vous exécutez ultérieurement la boîte de dialogue Assistant Mise à jour du modèle, toutes les modifications apportées au modèle de stockage, notamment la définition des requêtes, seront remplacées.

 

Ajouter un type d’entité au modèle

Dans cette étape, nous allons ajouter le type d’entité au modèle conceptuel à l’aide du Concepteur EF.  Notez les points suivants :

  • Le nom de l’entité correspond à la valeur de l’attribut EntityType dans l’élément EntitySet ci-dessus.
  • Les noms de propriétés correspondent aux noms de colonnes retournés par l’instruction SQL dans l’élément DefiningQuery ci-dessus.
  • Dans cet exemple, la clé d'entité est composée de trois propriétés pour garantir le caractère unique de la valeur de la clé.

Ouvrez le modèle dans le Concepteur EF.

  • Double-cliquez sur l’élément DefiningQueryModel.edmx.

  • Dites Oui au message suivant :

    Avertissement 2

 

Le Concepteur d’entités, qui fournit une surface de conception pour modifier votre modèle, s’affiche.

  • Cliquez avec le bouton droit sur l’aire du concepteur, puis sélectionnez Ajouter une nouvelle entité>....
  • Spécifiez GradeReport pour le nom de l’entité et CourseID pour la propriété clé.
  • Cliquez avec le bouton droit sur l’entité GradeReport, puis sélectionnez Ajouter une propriété New-Scalar>.
  • Remplacez le nom par défaut de la propriété par FirstName.
  • Ajoutez une autre propriété scalaire et spécifiez LastName pour le nom.
  • Ajoutez une autre propriété scalaire et spécifiez Grade pour le nom.
  • Dans la fenêtre Propriétés , remplacez la propriétéType de grade par Decimal.
  • Sélectionnez les propriétés FirstName et LastName .
  • Dans la fenêtre Propriétés , remplacez la valeur de la propriété EntityKey par True.

Par conséquent, les éléments suivants ont été ajoutés à la section CSDL du fichier .edmx.

    <EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />

    <EntityType Name="GradeReport">
    . . .
    </EntityType>

 

Mapper la requête de définition au type d’entité

Dans cette étape, nous allons utiliser la fenêtre Détails du mappage pour mapper les types d’entités conceptuelles et de stockage.

  • Cliquez avec le bouton droit sur l’entité GradeReport sur l’aire de conception et sélectionnez Mappage de table.
    La fenêtre Détails du mappage s’affiche.
  • Sélectionnez GradeReport dans la <liste déroulante Ajouter une table ou afficher> (située sous Tables).
    Les mappages par défaut entre le type d’entité GradeReport conceptuel et de stockage apparaissent.
    Détails du mappage3

Par conséquent, l’élément EntitySetMapping est ajouté à la section de mappage du fichier .edmx. 

    <EntitySetMapping Name="GradeReports">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
        <MappingFragment StoreEntitySet="GradeReport">
          <ScalarProperty Name="LastName" ColumnName="LastName" />
          <ScalarProperty Name="FirstName" ColumnName="FirstName" />
          <ScalarProperty Name="Grade" ColumnName="Grade" />
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
  • Compilez l’application.

 

Appeler la requête de définition dans votre code

Vous pouvez maintenant exécuter la requête de définition à l’aide du type d’entité GradeReport

    using (var context = new SchoolEntities())
    {
        var report = context.GradeReports.FirstOrDefault();
        Console.WriteLine("{0} {1} got {2}",
            report.FirstName, report.LastName, report.Grade);
    }