Entity Framework - Ajouter une propriété de navigation manuellement

115

J'ai généré un modèle Entity Framework (4.0) à partir de ma base de données. Je n'ai pas conçu la base de données et je n'ai aucun contrôle sur le schéma, mais il y a quelques tables qui n'ont pas de contraintes de clé étrangère définies, mais une relation implicite est définie.

Par exemple:

J'ai une table appelée People qui contient les colonnes suivantes: GenderID RaceID

Il existe des tables pour le sexe et la race, mais il n'y a pas de clé étrangère dans la table People.

Lorsque j'ai importé le modèle, il n'a pas ajouté de propriétés de navigation pour ces relations. J'ai essayé de l'ajouter manuellement mais From Role et To Role sont désactivés. Je ne sais pas comment ajouter moi-même la relation. Comment puis-je faire cela?

Dismissile
la source

Réponses:

181

Ouais - ce n'est pas si simple.

Voici ce que vous faites:

1 - Faites un clic droit sur le concepteur, Ajouter -> Association

2 - Configurer l'association et les cardinalités (Personnes * .. 1 Genre, Personnes * .. 1 Race)

3 - Allez dans le navigateur de modèles -> Associations

4 - Faites un clic droit sur vos associations nouvellement créées, cliquez sur Propriétés

5 - Ici, vous devez configurer les points de terminaison pour les options de clé et de cascade. Assurez-vous que les points de terminaison sont corrects. Vous pouvez également configurer ici une contrainte référentielle pour votre propriété de navigation implicite.

6 - Mappez la propriété de navigation aux tables / champs appropriés.

7 - Validez votre modèle, croisez les doigts.

J'espère que cela t'aides.

RPM1984
la source
20
+1 pour avoir sauvé ce qui reste de mes cheveux. J'ajouterai # 6 nécessite de changer la colonne de clé étrangère dans la page de propriétés de l'association, paramètre de contrainte référentielle. Appuyez sur [...] pour ouvrir la boîte de dialogue de contrainte référentielle et modifiez le champ factice que le concepteur a connecté à la table enfant sous Propriété dépendante.
Joel Brown
8
Vous devrez également accéder aux propriétés de la table enfant et supprimer le champ factice que le concepteur a ajouté (et qui ne correspond à aucun champ réel de la table enfant).
Joel Brown
2
Dans le cas de View, assurez-vous également que vous obtenez votre définition de clé primaire correctement (cliquez avec le bouton droit de la souris pour sélectionner les champs associés, marquez-les comme EntityKey dans les propriétés). Sinon, vous pourriez obtenir `` La multiplicité n'est pas valide dans le rôle dans la relation parce que le rôle dépendant fait référence aux propriétés clés ... ''
Mikl X
1
Sur # 2, vous voudrez peut-être vous assurer de décocher la case "Ajouter des propriétés de clé étrangère à l'entité". Cela crée des maux de tête inutiles si vous n'en avez vraiment pas besoin.
Chiffrement le
Une fois que vous mettez à jour à nouveau votre modèle à partir de la base de données, les entités échafaudées conserveront l'association ajoutée manuellement?
voodoo_patch
45

Je suis tombé sur ce billet de blog qui propose la solution suivante, qui a très bien fonctionné pour moi (malheureusement, je n'ai pas pu faire fonctionner les RPM1984 dans ma situation).

  1. Ajouter une association via le menu contextuel en arrière-plan du concepteur
  2. Configurez votre association (assurez-vous de décocher la création de la clé étrangère)
  3. Faites un clic droit sur l'association et choisissez Propriétés
  4. Cliquez sur le ...bouton pour la contrainte référentielle
  5. Configurer la relation entre les clés dans
  6. Vérifier (à partir du menu contextuel du concepteur)
  7. ???
  8. Profit!
dav_i
la source
4
+1 Point 4 m'a fait faire les choses correctement, négligé cela avec la réponse RPM194.
Hugo Logmans