EF4 - sélectionnés procédure stockée renvoie pas de colonnes
J'ai une requête dans une procédure stockée qui appelle certains serveurs liés à certains SQL dynamique. Je comprends que l'EF n'aime pas, je l'ai donc spécifiquement la liste de toutes les colonnes qui serait retourné. Pourtant, elle n'est pas toujours comme ça. Ce que je fais mal ici? Je veux juste EF pour être en mesure de détecter les colonnes retournées par la procédure stockée afin que je puisse créer les classes dont j'ai besoin.
Veuillez consulter le code suivant qui fait les dernières lignes de ma procédure stockée:
SELECT
#TempMain.ID,
#TempMain.Class_Data,
#TempMain.Web_Store_Class1,
#TempMain.Web_Store_Class2,
#TempMain.Web_Store_Status,
#TempMain.Cur_1pc_Cat51_Price,
#TempMain.Cur_1pc_Cat52_Price,
#TempMain.Cur_1pc_Cat61_Price,
#TempMain.Cur_1pc_Cat62_Price,
#TempMain.Cur_1pc_Cat63_Price,
#TempMain.Flat_Length,
#TempMain.Flat_Width,
#TempMain.Item_Height,
#TempMain.Item_Weight,
#TempMain.Um,
#TempMain.Lead_Time_Code,
#TempMain.Wp_Image_Nme,
#TempMain.Wp_Mod_Dte,
#TempMain.Catalog_Price_Chg_Dt,
#TempMain.Description,
#TempMain.Supersede_Ctl,
#TempMain.Supersede_Pn,
TempDesc.Cust_Desc,
TempMfgr.Mfgr_Item_Nbr,
TempMfgr.Mfgr_Name,
TempMfgr.Vendor_ID
FROM
#TempMain
LEFT JOIN TempDesc ON #TempMain.ID = TempDesc.ID
LEFT JOIN TempMfgr ON #TempMain.ID = TempMfgr.ID
Vous devez vous connecter pour publier un commentaire.
EF ne prend pas en charge l'importation des procédures stockées qui permettent de construire le jeu de résultats à partir de:
La raison en est que pour importer la procédure EF doit exécuter. Une telle opération peut être dangereux car il peut déclencher des changements dans la base de données. Parce que de l'EF utilise spécial de la commande SQL avant d'exécuter la procédure stockée:
Par l'exécution de cette commande procédure stockée sera de retour que "métadonnées" sur les colonnes dans son ensemble de résultats et il ne s'exécute pas sa logique. Mais parce que la logique n'a pas été exécuté il n'y a pas de table temporaire (ou construit requête dynamique) afin de métadonnées contient rien.
Vous avez deux choix (à l'exception de celui qui demande une ré-écriture de votre procédure stockée de ne pas utiliser ces fonctionnalités):
SET FMTONLY OFF
. Cela va permettre le repos de votre SP du code à exécuter de manière normale. Assurez-vous juste que vos SP ne modifie pas les données étant donné que ces modifications seront exécutées lors de l'importation! Après le succès de l'importation de supprimer ce hack.L'ajout de cette Non-Logiques bloc de code résolu le problème. Même s'il n'atteindra jamais les
Pourquoi mon dataset typé aime pas les tables temporaires?
http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataset/thread/fe76d511-64a8-436d-9c16-6d09ecf436ea/
Ou vous pouvez créer une Table Défini par l'Utilisateur de Type et de retour que.
Puis dans la procédure:
Maintenant EF doit être capable de reconnaître le retour de colonnes de type.
Comme certains l'ont noté, assurez-vous que la procédure s'exécute. En particulier, dans mon cas, j'ai été l'exécution de la procédure heureusement sans erreur dans SQL Server Management Studio complètement oublié que j'étais connecté avec des droits d'administrateur. Dès que j'ai essayé de lancer la procédure à partir de mon application principale de l'utilisateur, j'ai trouvé il y avait une table dans la requête que l'utilisateur n'a pas l'autorisation d'accès.
Ce que je voudrais ajouter, c'est:
Que l'importation échoue également si les procédures stockées, des paramètres et renvoie pas de résultat définie pour les valeurs de paramètre par défaut.
Ma procédure stockée a 2 paramètres de type float et qu'il ne reviendrait pas rien lorsque les deux paramètres sont à 0.
Afin d'ajouter cette procédure stockée pour le modèle d'entité, j'ai défini la valeur de ces paramètres dans la procédure stockée, de sorte qu'il est assuré de revenir quelques lignes, peu importe ce que les paramètres sont en réalité.
Puis après l'ajout de cette procédure stockée pour le modèle d'entité j'ai défait les modifications.
Note intéressante: Eu le même problème qui j'ai résolu en utilisant les Variables de Table, plutôt que de Tables temporaires (pour l'import). Ce n'était pas particulièrement intuitif pour moi, et m'a jeté lors de la première observation de mes deux SProcs: une aide de tables temporaires et un avec Tableau de Variables.
(FMTONLY SET OFF n'a jamais travaillé pour moi, donc je viens de changer mon SProcs temporairement pour obtenir la colonne info, plutôt que de s'embêter avec le hack sur le EF de côté juste comme un FYI.)
Ma meilleure option était vraiment juste de la création manuelle de type complexe et la cartographie de la fonction d'importation pour elle. Très travaillé, et la seule différence a fini par être qu'un autre FactoryMethod pour créer des propriétés a été inclus dans le Concepteur.
deux solutions :
1 - Définir le retourné de type complexe manuellement (je suppose que ça devrait fonctionner)
2 - Utiliser un hack et juste pour l'ajout de la procédure stockée mettre au début de son FMTONLY SET OFF.
ne fonctionne pas avec moi dans certains procédure, cependant, il a travaillé avec d'autres un!
ma procédure se termine avec cette ligne:
Grâce
En plus de ce que @tmanthley dit, assurez-vous que votre procédure stockée en fait, il fonctionne en exécutant d'abord dans SSMS. J'avais importé des procédures stockées et j'ai oublié un couple dépendant de fonctions scalaires, qui a causé EF déterminer que la procédure n'ont pas retourné de colonnes. Semble être une erreur, j'aurais pris plus tôt, mais EF ne vous donne pas un message d'erreur dans ce cas.
Dans mon cas, l'ajout de
SET NOCOUNT ON;
en haut de la procédure de résolution du problème. C'est la meilleure pratique de toute façon.Dans mon cas FMTONLY SET OFF ne fonctionne pas. La méthode que j'ai suivie est, j'ai pris de sauvegarde de l'original de la procédure stockée et remplacer uniquement le nom de colonne, comme la requête ci-dessous.
Après ce changement, créer une nouvelle fonction d'importation, de type complexe dans le cadre de l'entité.
Une fois la fonction d'importation et de type complexe est créé, remplacez la requête ci-dessus avec l'original de votre procédure stockée.
a fonctionné pour moi pour une de la procédure, mais a échoué pour une autre procédure. Étapes suivantes m'aide à résoudre mon problème
À l'intérieur d'une procédure stockée, j'ai créé une table temporaire avec le même type de colonne et inséré toutes les données renvoyées par la requête dynamique de la table temporaire.
et sélectionné le temp des données de la table.
Supprimé existant de type complexe, fonction d'importation et de la procédure stockée exemple pour les vieux de la procédure stockée et mise à jour de l'entité du modèle actuel de la nouvelle procédure.
Modifier la Fonction importée au sein de l'entité modal souhaité de type complexe, vous obtiendrez toutes les informations d'une colonne qui n'est pas prise en compte de la précédente procédure stockée.
une fois que vous avez fait avec le type de création que vous pouvez supprimer la table temporaire à partir d'une procédure stockée, puis actualisez Entity Framework.
Dans le cadre de l'Entité, lors de l'obtention de l'information de la colonne sql exécute la procédure de transmission des valeurs null en paramètre. J'ai donc géré null cas différemment, par la création d'une table temporaire avec toutes les colonnes requises et le retour de toutes les colonnes avec pas de valeur lorsque la valeur null est passé à la procédure.
Dans ma procédure de requête dynamique, quelque chose comme
Je n'obtenais pas les informations d'une colonne dans
mon cas, après l'aide de l'instruction set FMTONLY OFF truc.
C'est temp tableau que j'ai créé pour obtenir les données vides.
Maintenant, je me fais la colonne info
Entity Framework va essayer d'obtenir les colonnes par l'exécution de la procédure stockée, passer la valeur NULL pour chaque argument.
Assurez-vous que la procédure stockée renvoie quelque chose dans toutes les circonstances. Note qu'il aurait été plus intelligent d'Entity Framework pour exécuter la procédure stockée avec des valeurs par défaut pour les arguments, par opposition à des valeurs Null.
ER effectue les opérations suivantes pour obtenir les métadonnées de la table:
FMTONLY SET SUR
Cela va briser votre procédure stockée dans diverses circonstances, en particulier, si l'on utilise une table temporaire.
Donc, pour obtenir un résultat de type complexe; s'il vous plaît essayer en ajoutant
FMTONLY SET OFF;
Cela a fonctionné pour moi - espérons que cela fonctionne pour vous aussi.
Visée de https://social.msdn.microsoft.com/Forums/en-US/e7f598a2-6827-4b27-a09d-aefe733b48e6/entity-model-add-function-import-stored-procedure-returns-no-columns?forum=adodotnetentityframework