0

EF 4 ne prend pas en charge les associations qui ne sont pas basées sur des clés étrangères/primaires. Il y a beaucoup d'occasions où vous devez naviguer entre les tables en utilisant des champs non-clés.Entity Framework 4 - Associations

Par exemple, une table de médicaments a:

medID (PK) 
medGrouperID 
medName 

une table d'ingrédients a:

ingredientID (PK) 
ingredientName 

et une table de lien a:

medGrouperIDID (PK) 
ingredientID (PK) 

Dans ce cas EF n » t permettez-moi de créer une association entre les médicaments et la table des liens, car aucun n'a de clé étrangère pour l'autre.

Je n'ai pas fait de conception de base de données depuis longtemps donc j'ai du mal à comprendre cette restriction; S'agit-il d'une bonne conception de base de données ou d'un échec de EF?

EDIT
Le MedGrouperID permet à tous les médicaments avec les mêmes ingrédients, utilise, instructions, etc. pour être regroupés. Cela supprime la duplication des données qui existeraient si chaque médicament avait son propre ensemble d'enregistrements pour les ingrédients, les utilisations, etc.

L'ajout d'une nouvelle table MedGrouper fonctionnerait mais cela nécessiterait une jointure supplémentaire qui ne peut pas être bonne pour la performance .

médicaments

* MedID (PK) 
* MedGrouperID (FK) 
* MedName 

MedGrouper * MEDID (FK) * MedGrouperID (PK)

ingrédients

* IngredientID (PK) 
* IngrediantName 

MedicationIngredients (jonction/table de jointure)

* MedGrouperID (PK, FK) 
* IngredientID (PK, FK) 

/EDIT

+1

Pourquoi votre table de liens n'a-t-elle pas de relation FK avec les deux tables qu'elle est censée associer? Pourquoi voudriez-vous qu'un dossier de relation existe lorsqu'il n'y a pas de médicament ou d'ingrédient présent? –

+0

Ma compréhension est qu'un FK doit inclure tous les champs de la PK. Ainsi, les tables de med et d'ingrédient ne peuvent pas avoir de FK avec la table Link, car elles n'ont que des clés qui se chevauchent partiellement. – Alistair77

+0

Vous avez raison, vous ne voudriez pas que des rapports de parenté existent quand il n'y a aucun médicament ou ingrédient présent. Je suis bloqué sur cette question fondamentale: "Est-il normal et/ou approprié dans la conception ER de se joindre à des champs non PK/FK?" – Alistair77

Répondre

1

Est-ce une bonne conception de base de données suivante ou un échec de EF?

Ce n'est pas un échec de EF, c'est une conception de base de données incorrecte (désolé pour les sans contondants). Cette conception ne fonctionnerait pas du point de vue d'une base de données pure, par conséquent, vous ne pouvez pas vous attendre à ce que EF le fasse aussi.

Il semble que vous avez un *..* entre médicaments et Ingrédients.

Par conséquent, vous devriez avoir les tableaux suivants:

médicaments

  • MEDID (PK)
  • MedGrouperID
  • MedName

Ingrédients

  • IngredientID (PK)
  • IngrediantName

MedicationIngredients (jonction/table de jointure)

  • MEDID (PK, FK)
  • IngredientID (PK, FK)

Si vous créez un modèle à partir qu'utiliser Entity Framework, EF va créer deux entités nombreux à many présente, et la table de jointure aura pas être mappé du tout. Ce qu'il faut retenir, c'est que les relations sont basées sur l'intégrité référentielle, que vous n'avez pas configurée correctement dans votre schéma de base de données actuel.

HTH.

+0

Cela fonctionnera, mais en utilisant MedID dans la table de jointure plutôt que MedGrouperID signifie que chaque médicament aura son propre ensemble d'enregistrements d'ingrédients. Cela conduira à beaucoup de duplication. S'il vous plaît voir la mise à jour dans OP. BTW - J'apprécie votre franchise ;-) – Alistair77

+0

Peut voir votre mise à jour - il est difficile pour nous de conseiller car nous ne comprenons pas vraiment à 100% votre schéma et comment cela fonctionne (personne ne peut vraiment vous sauf). Fondamentalement, si vous voulez une relation via une propriété de navigation - vous avez besoin d'un FK qui correspond à un PK. Vous pouvez toujours * manuellement * effectuer les jointures - mais ce n'est pas idéal. Je voudrais aller avec la table MedGrouper - une table supplémentaire ne va pas faire de mal si cela a un sens logique, surtout si vous vous joignez à la PK/index – RPM1984