ADO.NET Entity Framework: l'assistant de mise à jour n'ajoutera pas de tables

93

J'ai ajouté un nouveau modèle de données d'entité ADO.Net dans mon projet et utilisé l' assistant de mise à jour pour ajouter des tables dans le modèle. Cinq des tables sélectionnées ont été ajoutées à l'aire de conception. Deux autres tables ne s'ajouteront pas. Je les sélectionne dans l'assistant et clique sur Terminer, mais ils n'apparaissent jamais sur l'aire de conception.

S'agit-il d'un bogue ou y a-t-il des situations où une table ne peut pas être ajoutée au modèle (par conception)?


MISE À JOUR: Le XML (* .edmx) révèle le problème.

<!--Errors Found During Generation:
warning 6013: The table/view 'FooBar.dbo.Roles' does not 
have a primary key defined and no valid primary key could be inferred. 
This table/view has been excluded. To use the entity you will need to 
review your schema, add the correct keys and uncomment it.-->
<!--<EntityType Name="Roles">
    <Property Name="role_id" Type="decimal" />
    <Property Name="role_desc" Type="nvarchar" MaxLength="30" />
</EntityType>-->
Robert Claypool
la source
8
Cela devrait avoir beaucoup plus de votes. Je n'avais aucune idée que Visual Studio ne pouvait pas ajouter la table car le fichier .edmx est le seul endroit où l'erreur se produit. J'espère qu'ils auront une boîte de dialogue dans la v2!
John Bubriski
+1 - Dans mon cas, il n'y avait pas de message d'erreur.
teynon
Comme vous l'avez noté, les tables qui n'étaient pas importées n'avaient pas de clés primaires. Ajoutez un PK et vous êtes prêt à partir.
Eric

Réponses:

46

L'aire de conception est différente du modèle d'entité. Il est possible d'avoir un tableau dans le mapping dans votre EDMX qui n'apparaît pas sur l'aire de conception. Affichez le fichier au format XML pour voir si tel est le cas. Dans ce cas, l'assistant de mise à jour ne vous permettra pas de rajouter les tables, car elles font déjà partie du modèle d'entité. Ainsi, de manière générale, l'assistant de mise à jour en sait plus sur votre modèle d'entité que sur l'aire de conception en soi .

Je ne pense pas que ce soit exactement la situation dans laquelle vous vous trouvez, mais cela devrait vous donner une idée générale de la solution: allez dans le XML et recherchez des références aux tables en question.

Craig Stuntz
la source
4
J'ai juste eu ce problème, j'ai supprimé une table du modèle et quand je suis allé l'ajouter à nouveau, le concepteur visuel ne l'a pas montré comme étant dans la base de données. Pour contourner le problème, j'ai supprimé le texte du fichier .edmx, mais j'ai réussi à gâcher le XML. Si vous faites cela, veuillez d'abord sauvegarder le fichier, juste au cas où. Heureusement, j'ai pu trouver la balise foirée avec git diff.
GrandMasterFlush
41

Définissez les clés primaires sur toutes les tables ou une seule case à cocher non cochée "Autoriser null" sur n'importe quelle colonne de chaque table. Ça marche pour moi :)

Parvinder
la source
2
Je crois que c'est la bonne réponse, du moins c'était pour moi. Merci!
Eric le
@Parvinder, j'ai eu du mal à résoudre ce problème dans la plupart de mon projet. Finalement, votre réponse a tout clarifié pour moi. Dans mon cas, dans la table de jointure, je n'ai pas spécifié le champ Clé non nulle ou simplement la clé primaire. Après avoir réparé cela, j'avais l'esprit tranquille. Merci beaucoup
PatsonLeaner
Ce que j'ai compris avec la résolution, c'est que nous ne pouvons pas ajouter une table dans Entity Model si i) cette table n'a pas de clé primaire ou (ii) il n'y a pas de colonne Allow Null dans cette table.
Murtuza Khan
10

1.Modifiez la structure du tableau et ajoutez une colonne principale. Mettez à jour le modèle.

Modifiez le fichier .EDMX dans l'éditeur XML et essayez d'ajouter une nouvelle colonne sous la balise pour cette table spécifique. (NE FONCTIONNERA PAS)

Au lieu de créer une nouvelle colonne principale vers la table de sortie, je créerai une clé composite en impliquant toutes les colonnes existantes.

Entity Framework: ajout de DataTable sans clé primaire au modèle d'entité.

Pratap
la source
J'ai rencontré ce même problème. Le modèle d'entité ajoutait la table, mais il ne s'affichait pas dans le concepteur. Je ne pouvais pas non plus y accéder dans le code. J'ai ajouté une clé de champ d'identification ... a fonctionné!
Ravi Ram
6

J'ai eu ce problème aussi, tout ce qui précède n'a pas fonctionné pour moi. Ce qui m'a aidé, c'est ce qui suit.

Lorsque vous essayez de vous connecter à une base de données, cette base de données peut avoir différents utilisateurs avec des informations d'identification différentes qu'elle peut accepter. Disons que l'utilisateur A jusqu'à D.

Si vous essayez de vous connecter avec un utilisateur, assurez-vous que l'utilisateur a les bonnes informations d'identification activées, dans ce cas, les options de lecture et d'écriture sont activées.

Pour ce faire, démarrez MS SQL Server Managment Studio, connecté à votre serveur SQL et sélectionnez la base de données avec laquelle vous essayez d'établir une connexion dans Visual Studio. Sous 'votre_nom_bd' -> Sécurité -> Utilisateurs, vous trouverez une liste d'utilisateurs. Cliquez avec le bouton droit sur le nom d'utilisateur avec lequel vous essayez de vous connecter et sélectionnez les propriétés. Une fenêtre s'ouvre. Sélectionnez la page 'Général' (sélectionnée par défaut) et sous l'onglet 'Appartenance au rôle de base de données' «Appartenance au assurez-vous que «db_datareader» et «db_datawrite» sont sélectionnés.

Remarque: lorsque vous vous connectez trop MS SQL Server Managment Studio, assurez-vous de vous connecter avec un utilisateur qui peut activer / désactiver ces options ...

Kip ei
la source
5

Vérifiez les «Nulls» dans votre table particulière. Si toutes les colonnes sont définies sur «Autoriser Null», Entity Framework la considère comme une table «Null». J'ai eu le même problème et décoché 'Autoriser Null' et il a ajouté la table requise.

Ketan Dubey
la source
1
Cela fonctionne, stupide aucune erreur ni avertissement n'apparaît dans les journaux!
RolandoCC
3

Les tables sans clé primaire ne seront pas ajoutées.

user8155123
la source
1

Ma solution à cela est de supprimer le modèle entier et de le lire, y compris les nouvelles tables que je souhaite.

J'ai accidentellement supprimé une table dans le concepteur une fois et je n'ai pas pu la lire. Par conséquent, supprimer le modèle entier et le lire.

J'ai également eu quelques problèmes avec cela (le modèle de données d'entité Ado.Net ne se met pas à jour correctement )

Communauté
la source
1

Ce problème a été résolu dans la dernière version (environnement: VS 2012, .net framework 4.5). Ouvrez simplement le fichier .edmx et ajoutez les tables / procédures stockées / vues requises. La table / vue qui n'a pas de clé primaire sera créée en tant que table / vue en lecture seule.

La table / vue "TABLE_NAME" n'a pas de clé primaire définie. La clé a été déduite et la définition a été créée en tant que table / vue en lecture seule.

Gyaneshwar Rao N
la source
1
l'erreur persiste dans certains cas de toute façon événement dans EF 5.0
Greg Z.
0

Vous n'avez pas besoin de supprimer le modèle entier (cela peut être des centaines de tables!).

L'assistant peut gérer "l'ajout de nouveaux" éléments, mais certains changements tels que la modification des clés composites et le changement de nom des colonnes - il ne sait pas quoi faire - donc il n'essaye pas - et les choses se désynchronisent.

SO: SUPPRIMEZ les tables en question du modèle (mode conceptuel) ET du Model.Store, puis mettez à jour le modèle à l'aide de l'assistant et ajoutez à nouveau uniquement les tables en question.

RoyGr
la source
0

Je vais simplement donner plus de détails à quiconque n'a pas eu à le faire auparavant. J'utilise Visual Studio 2013 avec la mise à jour 4 installée. J'ai ajouté quelques champs à une table, supprimé la table de mon modèle, puis mis à jour et cela ne me permettait pas de vérifier l'une des tables.

J'ai une clé primaire.

J'ai créé une nouvelle table de test, qui est apparue et elle me permettrait de la vérifier mais pas mon original.

Je ne l'ai jamais ouvert en XML auparavant et je ne savais pas comment faire cela. Vous faites un clic droit sur le fichier .edmx et «ouvrez avec» - choisissez l'éditeur xml.

la table en question était bien là, elle avait même les nouveaux champs (étrange).

J'ai supprimé toutes les références (cela a pris quelques fois) - après en avoir supprimé une et sauvegardée, si vous essayez de l'ouvrir et qu'elle ne s'affichera pas, choisissez "Afficher XML" - regardez les erreurs et, fondamentalement, suivez la balle qui rebondit jusqu'à ce que vous l'ayez nettoyée.

espérons que les détails supplémentaires aident quelqu'un.

Joe

Joe Ruder
la source
0

Un moyen simple que j'ai trouvé était (dans SQL Server Management Studio) d'ajouter une colonne ID de type INT, de désélectionner "Autoriser les Nulls", et sous Propriétés de la colonne (de l'ID) >> Spécification d'identité >> vérifier (Is Identity), et faire sûr que l'incrément est défini.

Une fois que ce qui précède est fait, retournez dans votre fenêtre .edmx, cliquez avec le bouton droit de la souris et mettez à jour le modèle à partir de la base de données.

Ryan D
la source
0

Vous pouvez ajouter une table croisée de colonne de clé primaire. Alors le problème se résout

Mehmet Kurt
la source
0

Une autre solution consiste à vous assurer que le compte par lequel vous accédez à la base de données dispose de certaines autorisations sur la table, sélectionnez au moins. La table ne sera pas ajoutée si le compte ne dispose d'aucune autorisation.

Dans SSMS, sous Sécurité, cliquez avec le bouton droit sur l'utilisateur ou le rôle, puis sur Propriétés. Cliquez ensuite sur Securables. Le tableau du haut montre les tableaux actuellement accessibles. Si les tables manquantes ne sont pas là, cliquez sur rechercher et trouver, puis mettez-les en surbrillance dans le tableau du haut, puis attribuez des autorisations dans le tableau du bas

Mark Worrall
la source