2010-12-15 75 views
1

J'ai une table dans mes articles de stockage de base de données:entités liées Modélisation avec cadre SQL Server et entité

Items 
------- 
ItemID 
Name 
... 
Etc 

et une table séparée stockage du PK de deux articles différents de la première table. Je veux être en mesure de lister un élément, puis un nombre quelconque d'éléments connexes. Je l'ai essayé de chercher des exemples, mais n'ai pas trouvé beaucoup étonnamment ...

RelatedItems 
------------ 
ItemID 
RelatedItemID 

Si j'ai quatre produits, dont les ID sont 1, 2, 3 et 4 ... et 1 est liée à 2 et 3 Je pourrais avoir des données qui ressemble à ceci:

ItemID RelatedItemID 
1  2 
1  3 
4  1 

Je leur modélisation puis dans Entity Framework designer et le concepteur ajoute automatiquement une association de la table Articles à lui-même (plusieurs à plusieurs). Le concepteur ajoute également deux propriétés de navigation, si j'utilise la première propriété sur l'article # 1 j'obtiens tous les articles où l'article # 1 est dans la première colonne, et si j'utilise la deuxième propriété j'obtiens tous les articles où l'article # 1 est dedans la deuxième colonne. Cependant, je veux juste avoir une propriété de navigation où je peux dire Items.RelatedItems et il retourne tous les éléments que les deux propriétés ci-dessus seraient combinées. Je sais que je peux joindre les deux résultats après le fait, mais je ne peux pas m'empêcher de penser que je fais quelque chose de mal et il y a une meilleure façon.

J'espère que tout cela est assez clair.

Répondre

1

Il semble que les schémas SQL ne sont pas très bons pour modéliser le concept que vous recherchez. Le schéma que vous avez choisi fonctionnerait bien si vous souhaitez établir une relation directionnelle (l'élément A est lié à l'élément B, mais l'élément B peut ou peut ne pas être lié à l'élément A). Si vous recherchez une relation de style groupe (les éléments A et B font partie du même groupe), je peux penser à une approche différente que vous utiliseriez. Mais je ne peux pas penser à un bon moyen de modéliser une relation intrinsèquement bidirectionnelle en utilisant une base de données relationnelle traditionnelle. Certaines solutions de contournement peuvent être d'utiliser une vue qui joint les deux résultats, ou d'utiliser des déclencheurs pour s'assurer que chaque mappage de A vers B a un mappage correspondant de B vers A, de sorte que les deux propriétés renvoient toujours le mêmes objets.

0

Si vous avez une instance d'un élément, appelez point, le suivant vous donnera les articles connexes ...

item.RelatedItems.Select(ri => ri.Item); 

Votre RelatedItems propriété sur le point (la première propriété de navigation que vous avez mentionné) sera une collection d'objets RelatedItem, chacun ayant deux propriétés de navigation, dont l'une sera nommée Item et sera un lien vers l'élément associé. Notez qu'il s'agit d'un code aérien, car je ne suis pas en face de quoi que ce soit que je puisse tester en ce moment, mais je pense que cela fera ce que vous voulez.

Si vous voulez le rendre plus simple, vous pouvez écrire une méthode d'extension pour envelopper le Select(), quelque chose comme ça ...

public static IEnumerable<Item> RelItems(this Item item) { 
    return item.RelatedItems.Select(ri => ri.Item); 
} 

alors vous pouvez faire ...

item.RelItems(); 

Notez que je ne pouvais pas nommer la méthode d'extension RelatedItems, car cela entrerait en conflit avec la propriété de navigation qu'EF aurait créée pour la seconde table.Ce n'est peut-être pas un bon nom pour ces tables, car ce ne sont pas les éléments réels, mais plutôt les identifiants des objets. De toute façon, le code ci-dessus devrait fonctionner.