web-dev-qa-db-fra.com

Actualisation d'une procédure stockée dans l'entité Framework 3.5

J'utilise .NET 3.5 SP1, VS 2008 avec le framework d'entité. J'ai initialement ajouté une procédure stockée à mon modèle qui prenait 2 paramètres. Plus tard, j'ai changé le sproc pour ne prendre que 1 paramètre. J'ai couru le Update Model From Database option de menu et a confirmé que mon sproc était répertorié dans l'onglet Refresh. Vous avez terminé l'assistant, nettoyé et reconstruit la solution et le modèle n'a jamais changé la signature du sproc.

Pourquoi n'est-il pas mis à jour? Le modèle de mise à jour à partir de la base de données est-il cassé? Suis-je en train de manquer quelque chose? Merci.

54
Jeff

J'ai vu deux problèmes avec la mise à jour d'une procédure stockée après l'avoir ajoutée au cadre d'entité:

  • La fonction d'importation créée pour appeler le SPROC n'a pas été mise à jour (paramètres incorrects et obsolètes)
  • Le type complexe créé pour l'ensemble de résultats du SPROC n'a pas été mis à jour (champs incorrects et obsolètes)

Mise à jour du modèle EDMX (importation de fonction)

  1. Ouvrez le fichier .edmx (dans le concepteur GUI).
  2. Faites un clic droit dans un espace ouvert et sélectionnez "Mettre à jour le modèle à partir de la base de données".
  3. Cliquez sur Terminer (si possible) dans la fenêtre contextuelle. La signature de votre SPROC doit être mise à jour (avec toutes les importations de fonctions).

Mise à jour du type complexe de procédure stockée

  1. ouvrez la fenêtre "Model Browser" pendant que le fichier .edmx est ouvert.

  2. Développez les nœuds ContentModel, EntityContainer: ..., puis Function Imports. Recherchez l'importation de fonction pour votre procédure stockée et double-cliquez. La même fenêtre que vous avez utilisée pour le créer s'ouvrira, mais maintenant remplie avec ses données.

  3. Cliquez sur le bouton Get Column Information (regardez la grille sous le bouton pour voir ce qui sera modifié).

  4. Cliquez sur le bouton Mettre à jour à côté du bouton radio "Complexe".

  5. Cliquez sur OK , et le type complexe de votre jeu de résultats devrait être mis à jour.

134
DaveD

Vous n'avez pas à modifier le edmx/xml. FAITES CECI:

Lorsque vous importez une procédure stockée dans l'EDMX (je parle d'une procédure qui renvoie un jeu de résultats, mais ce sera un processus similaire), 3, et non 1, des éléments sont créés, et c'est la source du problème. (*** la deuxième source du problème est que vous devez explicitement enregistrer après avoir supprimé des objets, avant de réimporter des objets, sinon les objets nouvellement réimportés entreront en conflit avec ce qui n'a pas été vraiment supprimé (en enregistrant) de l'edmx.

DONC! Faites ceci:

Dans Model Browser, généralement à gauche, collez le nom de votre procédure stockée dans la zone de recherche, cliquez sur Entrée (ou sur Recherche). Il atterrira sur la première instance - probablement la procédure stockée elle-même. Faites un clic droit et supprimez. Maintenant, remettez le curseur dans la zone de recherche -> appuyez sur Entrée ou effectuez une nouvelle recherche. Vous allez maintenant atterrir sur la fonction d'importation. Faites un clic droit et supprimez. Faites la même chose une troisième fois - cela atterrira sur le type complexe représentant l'ensemble de résultats. Supprime-le. Maintenant, vous avez terminé PAS !!!!!. Vous devez enregistrer ce que vous venez de faire, afin que les suppressions soient écrites (non écrites) dans l'edmx.

Maintenant, allez récupérer la procédure stockée à nouveau (modèle mis à jour/sélectionnez le proc stocké). MAINTENANT, CLIQUEZ SUR ENREGISTRER.

Cela fonctionnera à chaque fois. La clé est de s'assurer que lorsque vous utilisez le navigateur de modèle pour rechercher TOUTES les instances du nom de procédure stockée apparaissant dans le navigateur de modèle, et pour cette raison, il est préférable de ne pas s'embêter avec les conventions de dénomination par défaut. La deuxième clé consiste à ENREGISTRER après avoir terminé une étape.

13
jamescnectnet

Si vous devez modifier les types de données des colonnes dans l'ensemble de résultats -> au début du processus de stockage, ajoutez désactivez fmtonly

Utilisez ensuite Model Browser -> Function Import -> Edit Your Proc -> Get Column Information button -> Update button

C'est ainsi que Neil le fait :)

6
alex

si vous changez la signature du proc stocké, vous devrez mettre à jour tout type complexe créé dans le modèle via l'importation de fonction.

1
kram

Il a fallu beaucoup d'édition manuelle sur le XML et quelques redémarrages de Visual Studio mais j'ai finalement réussi à faire oublier à VS la signature précédente. Ensuite, j'ai simplement utilisé l'assistant EF normal pour l'ajouter à nouveau et cela a très bien fonctionné.

1
Jeff

Vous pouvez également effacer toutes les preuves du SP dans les endroits suivants, ces fichiers peuvent être trouvés dans le navigateur de modèles lorsque vous ouvrez le fichier .edmx:

  • YourModel> Types complexes;
  • YourModel> Function Imports;
  • YourModel.Store> Procédures/fonctions stockées.

Après l'avoir supprimé, vous pouvez l'ajouter sans problème.

0
Terkhos

Eu un problème similaire dans EF4 où il n'y a pas d'option pour actualiser les sps individuels, il est censé le faire lorsque vous cliquez sur Actualiser dans l'assistant de mise à jour, mais cela ne fonctionne pas de manière fiable. Je devais dans le navigateur de modèles supprimer les types complexes pour les valeurs de retour, ainsi que l'importation de fonction. Ensuite, allez dans le fichier edmx avec l'éditeur XML et supprimez la référence au proc stocké (impossible de trouver un moyen de le faire dans le navigateur de modèle). Ensuite, ajoutez à nouveau les sps.

0
Rob Sedgwick

Vous devez supprimer et ajouter des procédures stockées car le cadre d'entité doit générer une nouvelle définition pour votre procédure. Je suppose que vous devez refaire l'importation de la fonction.

Fondamentalement, si vous aviez changé la logique de la procédure et non le type de retour ou la signature, vous n'avez pas besoin de l'ajouter à nouveau. Cela fonctionnera bien, mais si vous modifiez le type de retour ou la signature, ef doit le générer et le mapper vers une nouvelle définition qui fonctionne comme cela.

0
Vishal