Problème avec Entity Framework 4, types complexes, StoredProcs et tables temporaires

complextype entity-framework

Question

Je me suis mis à genoux sur Entity Framework 4 et je rencontre un léger problème.

J'ai des procédures stockées que je tire dans mon EDMX. Lorsque je crée des types complexes à partir de ces processus, EF n’a aucun problème à obtenir les informations sur les colonnes. Sauf dans un endroit. Après avoir été perplexe pendant un moment, je me suis rendu compte que c’était ma table temporaire qui était remplie qui était à l’origine du problème. En fait, c'est simplement l'appel de la commande INSERT dans la table temporaire qui est à l'origine du problème. En fait, je ne le renseigne pas.

Bien que je sache que je peux créer manuellement un type complexe, puis mapper la fonction à ce type, j'aimerais pouvoir laisser EF le prendre en charge pour moi. Est-ce que quelqu'un sait ce que je fais mal?

Vous trouverez ci-dessous un exemple de procédure qui ne fonctionne pas. Exécutez ceci dans une base de données et ajoutez le proc à votre EDMX. Puis essayez d’obtenir les informations sur la colonne dans l’écran "Ajouter une fonction d’importation". Rien n'est retourné. Mettez en commentaire l'INSERT dans la table temporaire et obtenez les informations sur la colonne, et cela fonctionne.

Merci Steve

CREATE PROCEDURE dbo.TestProc
AS

SET NOCOUNT ON  

    CREATE TABLE #TempTable(
        StartDate datetime
    )

    INSERT INTO #TempTable
    SELECT  null


    DROP TABLE #TempTable

    SELECT 1 AS ReturnValue

SET NOCOUNT OFF
GO

Réponse populaire

Quelques petites choses à essayer.

  1. Utilisez plutôt des tables de variables -> peut-être que l'assistant d'importation préfère cela?
  2. Nommez vos champs de retour.

Essayez d’utiliser le processus stocké suivant (non testé .. il suffit de penser à voix haute ...)

CREATE PROCEDURE dbo.Foo
AS

    SET NOCOUNT ON

    DECLARE @ResultTable TABLE (SomeId INTEGER)

    INSERT INTO @ResultTable
    SELECT DISTINCT Id AS Identity -- Or u can rename this field to anything...
    FROM SomeExistingTableWhichHasAnIdentityField

GO

Essayez cela et voyez si l'assistant est actualisé, maintenant.

-

Tentative n ° 2 :)

Ok. Lorsque le concepteur / assistant / tout ce que EF ne parvient pas à comprendre EXACTEMENT ce que mon processus stocké est supposé renvoyer, je fais généralement ce qui suit:

  1. Assurez-vous que la procédure stockée n'existe pas du tout dans le concepteur / contexte EF, etc. (vous avez un point de départ vierge)
  2. Ouvrez votre procédure stockée et /* /* commentez TOUT après la définition de la procédure.

par exemple..

ALTER PROCEDURE dbo.Foo
(
    Bar1 INT,
    Bar2 TINYINT,
    ... // whatever u have as your optional input arguments //
)
AS
    SET NOCOUNT ON

    /* 
    .... every thing in here is commented out 
    */
GO

Maintenant ... 3. Ajoutez un faux retour forcé dans la procédure stockée, qui définit (plus ou moins) la structure / les champs de sortie.

par exemple..

ALTER PROCEDURE dbo.Foo
(
    Bar1 INT,
    Bar2 TINYINT,
    ... // whatever u have as your optional input arguments //
)
AS
    SET NOCOUNT ON

    SELECT 1 AS Id, 1 AS UserId, 1 AS SomeOtherId, 
        CAST('AAA' AS NVARCHAR(350)) AS Name,
        -- etc etc etc..
    /* 
    .... every thing in here is commented out 
    */
GO

et puis ...

  1. Ajoutez cette proc stockée à votre concepteur EF / assistant / etc ... Maintenant, les champs corrects doivent être "déterminés" par le concepteur. IMPRESSIONNANT. Oui .. les valeurs sont toutes codées en dur .. mais ça va (jusqu'à présent).
  2. Une fois que vous êtes heureux que EF soit correctement mis à jour, revenez à votre procédure stockée et supprimez tout SELECT codé en dur (ce que nous avons fait à l'étape précédente). Maintenant, nous supprimons les commentaires que nous avons commentés sur l'ensemble du code réel. Donc, vous devriez avoir votre proc stockée originale, de retour.

... et maintenant EF est mis à jour et ignore que nous avons modifié la tuyauterie de votre proc stockée.

gagner :)

ça marche pour toi?



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow