2010-01-19 6 views
20

J'utilise .net framework 3.5 SP1.Nombre de membres dans le type conceptuel ne correspond pas au nombre de membres sur le côté de l'objet type

Après avoir ajouté une colonne à une table dans Sql Server (ainsi que la modification d'une colonne existante de permettre nulls de ne pas annulable), je ne peux courir plus mon projet sans obtenir cette erreur:

The number of members in the conceptual type 'XBRLDimensionalModel.axis_t' does not match with the number of members on the object side type 'EOL.Xbrl.Persistence.Data.axis_t'. Make sure the number of members are the same.

I renoncé à essayer de trouver et de réparer le code généré. J'ai maintenant supprimé tous mes fichiers liés à l'entité locale et les ai générés à nouveau en recommençant à zéro et en ajoutant un nouvel élément (ADO.NET Entity Data Model). J'ai toujours cette erreur. La seule façon dont je peux maintenant exécuter le projet est d'annuler toutes mes modifications en attente et d'utiliser la dernière version du contrôle de source, et bien sûr modifier les deux colonnes de base de données modifiées à nullable. De tout ce que j'ai lu jusqu'à présent, il semble que j'aurais simplement dû pouvoir "mettre à jour" mon modèle depuis la base de données. Cela a abouti à cette exception (ci-dessus). Mais maintenant je suis totalement confus que même avec une régénération complète du modèle d'entité et des classes de soutien, je reçois toujours cette erreur.

J'ai changé la propriété sur mon modèle edmx: "Metadata Artifact Processing" à "Copy to Output Directory". Les fichiers Designer.cs, csdl, msl, ssdl semblent tous correspondre aux dernières modifications de la base de données.

L'exception est levée la première fois que mon instance entityModel est référencée. C'est donc avant tout chargement ou sauvegarde des données de la table modifiée.

des idées où je vais mal? Merci, TG

Répondre

6

Ouvrez votre modèle au format XML. Supprimez toutes les références à ce type de la CSDL. Enregistrez et fermez, puis rouvrez dans l'interface graphique. Maintenant, vous devriez être en mesure de mettre à jour le modèle comme d'habitude. Si cela ne fonctionne pas, faites la même chose, mais supprimez aussi de MSL.

+0

Craig, désolé, voulez-vous dire que le fichier CSDL ou le fichier edmx ou les deux? et une autre question stupide: pour "mettre à jour le modèle" puis-je juste un clic droit sur l'arrière-plan de l'interface graphique | Mettre à jour le modèle de base de données | (Onglet Actualiser) Terminer. ? –

+0

Et un autre: Quand vous dites "type", voulez-vous dire l'entité qui correspond à ma table (Axis_t)? –

+0

La CSDL est générée à partir de l'EDMX. Vous voulez éditer la section CSDL * de l'EDMX. Oui, vous faites un clic droit. Oui, je veux dire le type. –

1

Cela semble un peu bavard pour un commentaire si j'ajoute cela comme une autre réponse:

En réponse à la suggestion de Craig j'ai ouvert le fichier edmx dans une visionneuse XML et supprimé toutes les références à Axis_t (y compris les associations dues aux clés étrangères). De l'ensemble du fichier. J'ai ensuite "mis à jour" le modèle en ouvrant le fichier edmx en tant qu'interface graphique, cliquez avec le bouton droit sur | rafraîchir de la base de données | Ajouter (tabulation) qui ne liste maintenant que la table Axis_t. J'ai ajouté la table qui a semblé fonctionner correctement et a inclus ma nouvelle colonne et la colonne a été mappée correctement. J'ai alors couru le projet au même résultat. Même erreur que celle indiquée ci-dessus.

Je suis maintenant revenue à ce qui était dans le contrôle de source ainsi que de changer les colonnes de base de données (nouveau et modifié) comme nulle. Le projet fonctionne bien. Je n'ai toujours pas réussi à implémenter la nouvelle colonne DB dans EF. Il se comporte comme si une version stockée/compilée du modèle n'était pas mise à jour via le processus de "mise à jour".

+0

"Mise à jour de la base de données" remplacera complètement la section SSDL de l'EDMX. Il mettra également à jour le CSDL quand il croit pouvoir le faire sans effacer les changements que vous avez faits. Par exemple, si vous aviez une colonne entièrement nouvelle, elle devrait l'ajouter à la CSDL. D'un autre côté, si vous modifiez le type de la colonne, il se peut qu'elle ne mette pas à jour la CSDL. Si ma suggestion originale ne fonctionne pas pour vous, il est probable qu'il y a une partie de la MSL ou de la CSDL liée à cette entité que vous avez manquée. –

+0

Ça doit être quelque chose de stupide comme ça. Je viens d'effectuer un petit test séparément avec 2 tables (parent/enfant), mettre en place un nouveau modèle, puis ajouté une colonne à la table enfant. J'ai ensuite effectué vos étapes suggérées et cela a bien fonctionné. À l'heure actuelle, la seule différence est que le vrai projet est dans le contrôle de la source, mais je ne peux pas imaginer que cela affecterait cela. Je vais essayer (encore) de nouveau ... –

1

Lors de la modification d'une clé étrangère de nullable à non nulle (ou vice versa), veillez à changer la multiplicité d'association de 0..1 à 1 (ou vice versa). Le concepteur manque parfois ceci dans une mise à jour de la base de données.

32

Cette erreur peut également se produire si le fichier EDMX a été modifié en dehors de Visual Studio.Cliquez avec le bouton droit sur le fichier EDMX et cliquez sur "Run Custom Tool"

+2

Cela devrait être la réponse acceptée. –

0

Cela m'est arrivé lorsque je travaille sur deux versions de la même application (avec des différences de modèles) qui se compilent dans les mêmes dossiers.

Il semble que Visual Studio ne nettoie pas correctement le dossier temporaire "obj" et certains fragments de l'ancien modèle sont toujours présents.

Si je supprime simplement tous les fichiers du dossier "obj" et recompile cette erreur disparaît.

Le modèle dans chaque version est parfait ce qui me rendait fou.

Ne dis pas que c'est la réponse à la question de l'OP, mais il est certainement une autre raison de cette erreur.

Steve

0

J'ai eu ce même problème pendant des heures. Trouvé que dans mon fichier Designer.cs une des propriétés de mon entité manquait ses attributs. (Je ne sais pas comment cela est arrivé?)

[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)] 
[DataMemberAttribute()] 
public global::System.Int32 ContractCapacity 

Maintenant, le message d'erreur est logique, ce fut le DataMember manquant. Une fois l'attribut ajouté, IL A TRAVAILLÉ !!!

0
  • Faites un clic droit sur votre fichier edmx et ouvert avec XML.
  • Trouvez les types de données incorrects et modifiez-les.
  • Enregistrer le fichier.

Cela a fonctionné pour moi.

0

Voici un scénario de cauchemar que je viens de vivre: J'ai un site Web MVC2 et un service WCF qui sont construits séparément, mais partagent une configuration. Dans les deux projets, j'ai utilisé le même nom de conteneur d'entité; donc j'ai ramassé la même chaîne de connexion pour les deux projets. Finalement, les métadonnées se sont désynchronisées et ont provoqué cette erreur. La solution évidente était de ne pas utiliser le même nom de conteneur d'entité dans les deux projets; changer pour un nom différent m'a permis de spécifier des chaînes de connexion uniques, et donc des métadonnées, pour chaque composant qui évitait le problème. Maintenant que je l'ai compris, c'est évident, mais j'ai eu une heure ou deux tendues!

1

Je faisais face au même problème lorsque j'ai ajouté une colonne à db et ajouté la propriété correspondante à l'entité (edmx). J'utilisais aussi le contrôle de source pour ma solution. Comme je l'ai remarqué, lors de l'enregistrement des modifications apportées à un fichier, enregistrez les invites d'action avec l'option d'écrasement. J'ai donc écrasé le fichier designer.cs ainsi que le fichier de configuration et le problème a été résolu.

salutations, Bhushan

Questions connexes