2009-02-16 6 views
1

Entity Framework interprète magiquement la structure de table suivante comme une relation plusieurs-à-plusieurs. Mais si la table de jointure comporte des champs supplémentaires, elle sera interprétée comme deux relations un-à-plusieurs.Relation plusieurs-à-plusieurs avec une clé de substitution dans Entity Framework

J'utilise une base de données dans laquelle la table de jointure a une clé de substitution comme clé primaire. Pour cette raison, EF l'interprète comme deux relations un-à-plusieurs. Est-il possible de modifier l'interprétation de EF: s pour en faire une véritable relation plusieurs-à-plusieurs dans le modèle? Peut-il être fait en utilisant le concepteur?

Répondre

1

Je suis sûr que cela ne peut pas être fait en utilisant le concepteur. Je ne sais pas s'il existe un moyen de le faire manuellement dans EDMX, mais je n'en ai jamais vu un exemple. Une solution de contournement possible pourrait être de ne pas mapper la clé de substitution du tout. Si vous pouvez générer cela sur la base de données, vous n'en aurez peut-être pas besoin dans votre modèle.

+0

La clé de substitution n'a pas vraiment d'intérêt, alors cela fonctionnerait bien. Simplement supprimer le champ du modèle ne semble pas faire de différence. Pourrait-il être exclu d'une manière plus précise ou quelque chose? –

+0

La suppression de la clé de substitution dans le concepteur ne le supprime pas du modèle de stockage. Vous devrez éditer manuellement l'EDMX pour cela. –

2

cela est possible, mais cela nécessite un peu de travail manuel dans le fichier EDMX, et je n'ai pas réussi à faire en sorte que EF utilise la clé de substitution comme clé primaire réelle sur la table de liaison. Vous devez faire en sorte que EF utilise une combinaison de foo_id et de bar_id comme clé primaire.

dans votre modèle de stockage que vous devez changer la EntityType de la table de lien de

<EntityType Name="foo_bar"> 
    <Key> 
     <PropertyRef Name="surrogate_pk" /> 
    </Key> 
    <Property Name="surrogate_pk" Type="bigint" Nullable="false" StoreGeneratedPattern="Identity" /> 
    <Property Name="foo_id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
    <Property Name="bar_id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
</EntityType> 

à:

<EntityType Name="foo_bar"> 
    <Key> 
     <PropertyRef Name="foo_id" /> 
     <PropertyRef Name="bar_id" /> 
    </Key> 
    <Property Name="foo_id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
    <Property Name="bar_id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
</EntityType> 

Vous faites la clé de substitution invisible à EF, et lui dire d'utiliser la combinaison des deux clés étrangères comme clé primaire.

Dans votre modèle conceptuel, vous devez avoir le nombre-many défini:

<Association Name="foo_bar_association"> 
    <End Role="foo" Type="foo" Multiplicity="*" /> 
    <End Role="bar" Type="bar" Multiplicity="*" /> 
</Association> 

et dans vos applications, un AssociationSetMapping:

<AssociationSetMapping Name="foo_bar_association" TypeName="foo_bar_association" StoreEntitySet="foo_bar"> 
    <EndProperty Name="foo"> 
     <ScalarProperty Name="id" ColumnName="foo_id" /> 
    </EndProperty> 
    <EndProperty Name="bar"> 
     <ScalarProperty Name="id" ColumnName="bar_id" /> 
    </EndProperty> 
</AssociationSetMapping> 

De loin la meilleure façon d'obtenir ce à droite, est de supprimer la clé de substitution de la base de données, générer l'EDMX, puis mettre ce modèle sur votre base de données d'origine. Le résultat sera le même. EF n'a pas vraiment besoin de la clé de substitution pour quoi que ce soit, la table est invisible dans une association de plusieurs personnes

+0

Je ne peux pas dire que je l'ai testé, mais cette réponse semble exacte. –

Questions connexes