Types complexes : Concepteur EF
Cette rubrique montre comment mapper des types complexes avec Entity Framework Designer (EF Designer) et comment interroger des entités qui contiennent des propriétés de type complexe.
L’image suivante montre les fenêtres principales utilisées lors de l’utilisation de EF Designer.
Remarque
Lorsque vous générez le modèle conceptuel, des avertissements sur les entités et les associations non mappées peuvent s'afficher dans la Liste d'erreurs. Vous pouvez ignorer ces avertissements, car une fois que vous choisissez de générer la base de données à partir du modèle, les erreurs disparaissent.
Qu’est-ce qu’un type complexe
Les types complexes sont les propriétés non scalaires des types d'entités qui permettent d'organiser les propriétés scalaires au sein des entités. À l'instar des entités, les types complexes regroupent des propriétés scalaires ou d'autres propriétés de type complexe.
Lorsque vous travaillez avec des objets qui représentent des types complexes, prenez en considération :
- Les types complexes n'ont pas de clés et, par conséquent, ne peuvent pas exister indépendamment. Les types complexes peuvent uniquement exister en tant que propriétés de types d'entités ou d'autres types complexes.
- Les types complexes ne peuvent pas participer à des associations et ne peuvent pas contenir de propriétés de navigation.
- Les propriétés de type complexe ne peuvent pas avoir la valeur null. Une exception **InvalidOperationException **se produit lorsque DbContext.SaveChanges est appelée et qu’un objet complexe Null est rencontré. Les propriétés scalaires des objets complexes peuvent être null.
- Les types complexes ne peuvent pas hériter d'autres types complexes.
- Vous devez définir le type complexe en tant que class.
- EF détecte les modifications apportées aux membres sur un objet de type complexe quand DbContext.DetectChanges est appelée. Entity Framework appelle DetectChanges automatiquement lorsque les membres suivants sont appelés : DbSet.Find, DbSet.Local, DbSet.Remove, DbSet.Add, DbSet.Attach, DbContext.SaveChanges, DbContext.GetValidationErrors, DbContext.Entry, DbChangeTracker.Entries.
Refactoriser les propriétés d’une entité dans un nouveau type complexe
Si vous disposez déjà d’une entité dans votre modèle conceptuel, vous pouvez refactoriser certaines des propriétés dans une propriété de type complexe.
Sur l'aire du concepteur, sélectionnez une ou plusieurs propriétés (à l'exclusion des propriétés de navigation) d'une entité, puis cliquez avec le bouton droit et sélectionnez Refactoriser -> Déplacer vers un nouveau type complexe.
Un nouveau type complexe avec les propriétés sélectionnées est ajouté à l'Explorateur de modèles. Un nom par défaut est affecté au type complexe.
Une propriété complexe du type récemment créé remplace les propriétés sélectionnées. Tous les mappages de propriété sont conservés.
Pour créer un nouveau type complexe
Vous pouvez également créer un type complexe qui ne contient pas de propriétés d’une entité existante.
Cliquez avec le bouton droit sur le dossier Types complexes dans l’explorateur de modèles, pointez sur Ajouter nouveau type complexe…. Sinon, vous pouvez sélectionnez le dossier Types complexes, puis appuyez sur la touche Insertion de votre clavier.
Un nouveau type complexe est ajouté au dossier avec un nom par défaut. Vous pouvez maintenant ajouter des propriétés au type.
Ajout de propriétés à un type complexe
Les propriétés d'un type complexe peuvent être des types scalaires ou des types complexes existants. Toutefois, les propriétés de type complexe ne peuvent pas avoir de références circulaires. Par exemple, un type complexe OnsiteCourseDetails ne peut pas avoir une propriété de type complexe OnsiteCourseDetails.
Vous pouvez ajouter une propriété à un type complexe en appliquant l'une des méthodes répertoriées ci-dessous.
Cliquez avec le bouton droit sur un type complexe dans l'Explorateur de modèles, pointez sur Ajouter, sur Propriété scalaire ou sur Propriété complexe, puis sélectionnez le type de propriété désiré. Sinon, vous pouvez sélectionnez un type complexe puis appuyez sur la touche Insertion de votre clavier.
Une nouvelle propriété est ajoutée au type complexe avec un nom par défaut.
- OU -
Cliquez avec le bouton droit sur une propriété d'entité sur EF Designer, sélectionnez Copier, puis cliquez avec le bouton droit sur le type complexe dans l'Explorateur de modèles et sélectionnez Coller.
Renommer un type complexe
Lorsque vous renommez un type complexe, toutes les références au type sont mises à jour dans tout le projet.
Double-cliquez lentement sur un type complexe dans l'Explorateur de modèles. Le nom est sélectionné et passe en mode édition.
- OU -
Cliquez avec le bouton droit sur un type complexe dans l'Explorateur de modèles, puis sélectionnez Renommer.
- OU -
Sélectionnez un type complexe dans l'Explorateur de modèles, puis appuyez sur la touche F2.
- OU -
Cliquez avec le bouton droit sur un type complexe dans l'Explorateur de modèles, puis sélectionnez Propriétés. Modifiez le nom dans la fenêtre Propriétés.
Ajouter un type complexe existant à une entité et mapper ses propriétés à des colonnes de table
Cliquez avec le bouton droit sur une entité, pointez sur Ajouter un nouveau, puis sélectionnez Propriété complexe. Une propriété de type complexe avec un nom par défaut est ajoutée à l'entité. Un type par défaut (sélectionné dans les types complexes existants) est affecté à la propriété.
Affectez le type désiré à la propriété dans la fenêtre Propriétés. Après avoir ajouté une propriété de type complexe à une entité, vous devez mapper ses propriétés aux colonnes de la table.
Cliquez avec le bouton droit sur un type d'entité sur l'aire de conception ou dans l'Explorateur de modèles et sélectionnez Mappages de table. Les mappages de table s'affichent dans la fenêtre Détails de mappage.
Développez le nœud Est mappé à <Nom de Table>. Un nœud Mappages de colonnes s'affiche.
Développez le nœud Mappages de colonnes. Une liste de toutes les colonnes de la table s'affiche. Les propriétés par défaut (si elles existent) auxquelles les colonnes sont mappées sont répertoriées sous l'en-tête Valeur/Propriété.
Sélectionnez la colonne à mapper, puis cliquez avec le bouton droit sur le champ Valeur/Propriété correspondant. Une liste déroulante de toutes les propriétés scalaires s'affiche.
Sélectionnez la propriété appropriée.
Répétez les étapes 6 et 7 pour chaque colonne de la table.
Remarque
Pour supprimer le mappage d’une colonne, sélectionnez la colonne à mapper, puis cliquez sur le champ Valeur/Propriété. Sélectionnez ensuite Supprimer dans la liste déroulante.
Mapper une importation de fonction à un type complexe
Les importations de fonction sont basées sur les procédures stockées. Pour mapper une importation de fonction à un type complexe, les colonnes retournées par la procédure stockée correspondante doivent correspondre aux propriétés du type complexe en nombre et doivent avoir des types de stockage qui sont compatibles avec les types de propriété.
Double-cliquez sur une fonction importée que vous souhaitez mapper à un type complexe.
Définissez les paramètres de la nouvelle importation de fonction comme suit :
Spécifiez la procédure stockée pour laquelle vous créez une importation de fonction dans le champ Nom de la procédure stockée. Ce champ est une liste déroulante qui affiche toutes les procédures stockées dans le modèle de stockage.
Spécifiez le nom du Function Import dans le champ Nom du Function Import.
Sélectionnez Complexe comme type de retour, puis indiquez le type de retour complexe spécifique en sélectionnant le type approprié dans la liste déroulante.
Cliquez sur OK. L'entrée function import est créée dans le modèle conceptuel.
Personnaliser le mappage de colonnes pour l’importation de fonction
- Cliquez avec le bouton droit sur l'importation de fonction dans l'Explorateur de modèles et sélectionnez Mappage d'importation de fonction. La fenêtre Détails de mappage apparaît et affiche le mappage par défaut pour l'importation de fonction. Les flèches indiquent les mappages entre valeurs de colonne et valeurs de propriété. Par défaut, les noms de colonne sont supposés être les mêmes que ceux de la propriété du type complexe. Les noms de colonne par défaut s'affichent en gris.
- Si nécessaire, changez les noms des colonnes pour qu'ils correspondent aux noms des colonnes retournés par la procédure stockée correspondant à l'importation de fonction.
Supprimer un type complexe
Lorsque vous supprimez un type complexe, le type est supprimé du modèle conceptuel, et les mappages pour toutes les instances du type sont supprimés. Toutefois, les références au type ne sont pas mises à jour. Par exemple, si une entité a une propriété de type complexe de type ComplexType1 et que ComplexType1 est supprimé dans l'Explorateur de modèles, la propriété d'entité correspondante n'est pas mise à jour. Le modèle n'est pas validé, car il contient une entité qui référence un type complexe supprimé. Vous pouvez mettre à jour ou supprimer des références à des types complexes supprimés à l'aide du Concepteur d'entités.
Cliquez avec le bouton droit sur un type complexe dans l'Explorateur de modèles, puis sélectionnez Supprimer.
- OU -
Sélectionnez un type complexe dans l'Explorateur de modèles, puis appuyez sur la touche Suppr de votre clavier.
Requête pour les entités contenant des propriétés de type complexe
Le code suivant indique comment exécuter une requête qui retourne une collection d’objets de type d'entité qui contiennent une propriété de type complexe.
using (SchoolEntities context = new SchoolEntities())
{
var courses =
from c in context.OnsiteCourses
order by c.Details.Time
select c;
foreach (var c in courses)
{
Console.WriteLine("Time: " + c.Details.Time);
Console.WriteLine("Days: " + c.Details.Days);
Console.WriteLine("Location: " + c.Details.Location);
}
}