web-dev-qa-db-fra.com

Ajout de types complexes de procédures stockées dans Entity Framework

J'essaie d'utiliser une procédure stockée dans Entity Framework qui ne renvoie rien.

J'ai fait ce qui suit:

  1. Ajout d'une fonction (clic droit sur la procédure stockée -> ajouter -> importation de fonction -> type de complexe -> obtenir des informations sur la colonne -> créer un nouveau type de complexe)

  2. Mon nom de fonction: summarySP_Result. Après la construction du projet, la classe d'entité n'est pas générée dans Generated_code (BusinessAccount.web.g.cs).

Mais les classes d'entités pour les tables et les vues sont toutes créées, mais non plus pour les procédures stockées.

Quelqu'un peut-il expliquer pourquoi la classe d'entité n'est pas générée dans BusinessAccount.web.g.cs?

Mettre à jour : 

Permettez-moi de confirmer la classe d'entités ReturnDataFromTemTable_result créée dans votre classe XXXXXX.web.g.cs.

Comme : 

[DataContract(Namespace="http://schemas.datacontract.org/2004/07/BizFramework.Web.Model")]
public sealed partial class ReturnDataFromTemTable_Result : Entity
{
   -------------------
 }
33
Kavitha

OK - voici comment procéder pas à pas:

(1) ajoutez votre procédure stockée au fichier EDMX (lorsque vous la créez pour la première fois, ou plus tard, en utilisant Update model from database et en choisissant cette procédure stockée)

(2) une fois que vous avez la procédure stockée dans votre modèle, utilisez le Model Browser pour ajouter un Function Import:

enter image description here

(3) la prochaine boîte de dialogue qui apparaît est vitale - vous devez (1) définir que la procédure stockée renvoie une collection de types complexes, puis vous devez (2) obtenir les informations de colonne de cette procédure stockée pour savoir quelles colonnes il retournera, puis (3) vous indiquez à Visual Studio de générer un nouveau type complexe basé sur les informations de cette colonne:

enter image description here

(4) Une fois que vous avez fait cela, vous devriez maintenant voir la procédure stockée dans votre section de modèle conceptuel dans l'Explorateur de modèles, et le type complexe nouvellement généré devrait également apparaître ici:

enter image description here

64
marc_s

Si le problème persiste, une fois que vous avez ajouté la fonction Importation, accédez à l'Explorateur de solutions, cliquez avec le bouton droit de la souris sur votre fichier {name} .Context.tt et exécutez "Exécuter l'outil personnalisé". La méthode va maintenant apparaître dans votre classe de contexte dérivée.

enter image description here

Cela ressemble à un bogue dans Visual Studio 2012, c'est ce que j'utilise, je n'ai pas appliqué la mise à jour 1, je vais essayer de voir si cela résout le problème.

13
Chris Amelinckx

C'est pour Ross Brigoli

Essayez d’ajouter cette ligne au début de votre procédure stockée:

SET FMTONLY OFFVous pouvez le supprimer une fois l'importation terminée.

Source: - Pourquoi Entity Framework ne peut-il pas voir les informations de colonne de ma procédure stockée?

11
Sandeep

Comme Sandeep l’a dit, EF ne prend pas en charge l’importation de procédures stockées qui construisent un ensemble de résultats à partir de requêtes dynamiques ou de tables temporaires.

Mais vous n'êtes pas obligé de réécrire tout votre SP. 

Il suffit d’en écrire un autre, portant le même nom, renvoyant le format de ligne approprié sans utiliser de code SQL dynamique ni de table temporaire. Utilisez ensuite la fonction d’ajout EF SP, qui générera désormais automatiquement le type complexe. 

Éditer: Il est en fait plus facile de faire un commentaire en haut du SP qui sélectionne immédiatement la ligne souhaitée avec tous les types de données spécifiés avec CASTS. Lorsque vous devez importer le SP dans EF, décommentez simplement le code. 

par exemple. 

CRÉER UNE PROCÉDURE myProc ()
COMME
COMMENCER
- décommentez la ligne suivante à importer:
- SELECT CAST (0 AS int) AS nom de colonne1, CAST ('a' AS varchar (50)) AS nom de colonne 

- commentez le contenu SP lorsque vous souhaitez l'importer.
<bon contenu SP>
FIN

Ensuite, déposez le proc stocké et créez l'original.
Enregistrez cette importation temporaire SP que vous avez effectuée au cas où vous en auriez encore besoin. 

3
Markus
create procedure [dbo].[usp_InsertOrUpdate]
/*if your table(tbl_InsertOrUpdate) as 3 columns like uniqueid,col1,col2*/
@uniqueId bigint NULL,/*if insert send value as null or 0*/
@col1 bigint null,
@col2 [varchar](500) NULL
as
begin
set nocount ON
SET FMTONLY OFF
/* for giving result which column updated(uniqueId) and is it insert or update(IsInsert)*/
declare @varResult table (uniqueId bigint ,IsInsert bit )
/*create a var table before inserting original table*/

declare @varInsertOrUpdate table (
uniqueId bigint ,
col1 [bigint] ,
col2 [varchar]
)
/*default we are feel as update only*/
insert into @varResult (uniqueId,IsInsert) values (@uniqueId,0)
/*insert into var table*/
INSERT INTO @varInsertOrUpdate (uniqueId,col1,col2)
VALUES
(@uniqueId,@col1,@col2)
/*Insert into original table with where condition without if else*/
 INSERT INTO tbl_InsertOrUpdate (col1,col2)
 select col1,col2 from @varInsertOrUpdate
 where uniqueId!=0;
/*if its insert updating result returning table*/
 update @varResult set 
 uniqueId=IDENT_CURRENT('tbl_InsertOrUpdate'),
IsInsert=1 where @uniqueId=0;
/*updating table where @uniqueid is  null or empty*/
UPDATE tbl_InsertOrUpdate
SET col1=@col1, 
col2=@col2,
WHERE uniqueId=@uniqueId and @uniqueId!=0

select *  from @varResult

end
2

EF ne prend pas en charge l’importation de procédures stockées qui construisent un ensemble de résultats à partir de:

  • Requêtes dynamiques
  • Tables temporaires

Réécrivez votre procédure stockée pour utiliser plutôt une variable de table. n'oubliez pas de supprimer la procédure et l'importation stockées de votre modèle avant la mise à jour, car elles ne généreront pas le type complexe à moins d'ajouter également la procédure stockée. ou accédez aux propriétés d'importation des fonctions et utilisez la fonctionnalité d'obtenir des informations sur la colonne après la mise à jour de votre procédure stockée.

2
Verard Sloggett

Pour moi, j'ai des problèmes lorsque l'importation de ma procédure stockée dans EF ne génère pas l'objet de retour Entité complexe (automatiquement). Après avoir commenté des sections de mon sproc (procédure stockée), j’ai trouvé que lorsque je réimportais à nouveau la procédure stockée (c’est-à-dire qu’il était actualisé à l’aide du bouton Obtenir les informations sur la colonne dans l’écran Fonction Import Edit), pourrait alors être généré!

En bref, il pourrait y avoir une clause where (ou peut-être autre chose) empêchant EF de générer le type complexe. Essayez de commenter des sections de votre sproc et de réimporter le sproc dans

METTRE À JOUR:

Suite à mon enquête ci-dessus, j'ai constaté que la raison pour laquelle l'entité complexe n'était pas générée était parce que mon sproc utilisait une vue (au lieu d'un tableau typique). Par curiosité, j'ai changé la vue sur une autre table uniquement pour voir ce qui se produirait et l'entité complexe générée.

En bref, il semble que les entités complexes pourraient ne pas générer automatiquement si vous avez une vue. Pour essayer, j'ai temporairement arraché la vue, réimporté le sproc, généré l'entité complexe, puis remis la vue dedans. Mais maintenant, mon code donne des exceptions.

Mettra à jour plus tard quand j'apprendrai plus =)

METTRE À JOUR:

Correction du problème. Vraie erreur stupide! Le nom de vue que j'utilisais n'était pas orthographié right = D. Je suis en quelque sorte en colère qu'une erreur n'ait pas été générée par Sql Server lorsque j'ai créé le sproc ..... Je suppose que c'est la vie :) Hélas, le problème est maintenant résolu!

1
Jeff Moretti

C'est mon SP pour implémenter la recherche multiple 

***************************************************

    CREATE PROCEDURE [dbo].[uspSEARCH_POSITIONS]
        @OBJ_TYPE_REQUEST varchar(2000),--'FIRST_NAME;SEARCHVALUE|LAST_NAME;SEARCHVALUE|JOB_DESCRIPTION;SEARCHVALUE'
        @DELIMITER varchar(10) --'| Which seperates the col;searchvalue|col;searchvalue
    AS
    BEGIN
    SET FMTONLY OFF
        DECLARE
            @lLastName varchar(100),
            @lFirstName varchar(100),
            @lPositionNumber varchar(20),
            @lJobDescription varchar(50),
            @lJobCode varchar(20),
            @lOccupancyIndicator varchar(50),
            @ldeleimitercolsearchval varchar(10)

    SET @ldeleimitercolsearchval =';'

    CREATE TABLE #TempTable (ColSearchValues VARCHAR(2000))

    INSERT INTO #TempTable 
    SELECT * FROM [dbo].[fnSplit](@OBJ_TYPE_REQUEST,@DELIMITER)--'fname;searchvalfname|lname;searchvallname|jobcode;searchvaljobcode','|')

    SELECT @lLastName=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%last%'
    SELECT @lFirstName =SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%first%'
    SELECT @lPositionNumber =SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%position%'
    SELECT @lJobDescription=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%jobd%'
    SELECT @lJobCode=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%jobc%'
    SELECT @lOccupancyIndicator=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%ccupancy%'

           SELECT  [PS].[POSITION_NUMBER]
          ,[PS].[COST_CENTER]
          ,[PS].[JOB_CODE]
          ,[PS].[JOB_CODE_DESCRIPTION]
          ,[PS].[SITE_CODE]
          ,[EMP].[EMPLOYEE_ID]
          ,[EMP].[EIN]
          ,[EMP].[GRADE]
          ,[EMP].[LOGIN_ID]
          ,[EMP].[FIRST_NAME]
          ,[EMP].[LAST_NAME]
          ,LTRIM(RTRIM(ISNULL([EMP].[LAST_NAME],''))) + ',' +LTRIM(RTRIM(ISNULL([EMP].[FIRST_NAME],''))) AS [FULL_NAME]      
          ,[EMP].[DISTRICT]
          ,[EMP].[SUPERVISOR_EIN]
          ,COUNT(*) OVER() AS TOTAL_RECORD_COUNT
      FROM [DBSERVER].[dbo].[uvwPOSITION_SEARCH] PS
      LEFT JOIN [DBSERVER].[dbo].[uvwEMPLOYEES] EMP
      ON PS.POSITION_NUMBER=EMP.POSITION_NUMBER
      WHERE
            (@lLastName  IS NULL OR [LAST_NAME] LIKE '%' + @lLastName + '%')
        AND (@lFirstName IS NULL OR [FIRST_NAME] LIKE '%' + @lFirstName + '%')
        AND (@lPositionNumber IS NULL OR [PS].[POSITION_NUMBER] LIKE '%' + @lPositionNumber + '%')
        AND (@lJobDescription IS NULL OR [PS].[JOB_CODE_DESCRIPTION] LIKE '%' + @lJobDescription + '%')
        AND (@lJobCode IS NULL OR [PS].[JOB_CODE] LIKE '%' + @lJobCode + '%')
        AND (@lOccupancyIndicator IS NULL OR [EMP].[FILLED_VACANT] LIKE '%' + @lOccupancyIndicator + '%')

    END

Maintenant, vous pouvez consommer ci-dessus SP dans edmx en utilisant ci-dessous

Ajout de types complexes de procédures stockées dans Entity Framework

Pourquoi Entity Framework ne peut-il pas voir les informations de colonne de ma procédure stockée?

Et au cas où vous auriez à mettre à jour votre SP ci-dessous, cela a fonctionné pour moi ……………. Mettre à jour un type complexe si des mises à jour de procédures stockées sont mises à jour Comment puis-je obtenir Entity Framework pour mettre à jour des types complexes?

1
Sandeep

Pour ajouter correctement un type complexe, allez dans Navigateur de modèles, cliquez avec le bouton droit de la souris sur la fonction, puis sélectionnez Modifier, cliquez sur Modifier et remplissez la boîte de dialogue. Le nom de la fonction doit être identique à celui de la procédure stockée. Cliquez sur le bouton OK. Maintenant, la fonction est créée. Puis faites un clic droit sur la fonction créée et allez à nouveau éditer. Il y a un bouton de mise à jour à côté du bouton de type complexe.Mettez-le à jour en utilisant ce bouton de mise à jour. Maintenant, le type complexe est créé complètement.

0
Thilini

La question de la non-apparition de caractères complexes peut survenir pour une raison différente, ce à quoi j'ai dû faire face dans notre cas. Le problème était dû à une erreur de syntaxe dans SPROC où la table temporaire était définie comme suit: - Create table #temp ( Col1 int, Col2 nvarchar (100), Col3 nvarchar (100) , - Notez la virgule à la fin ); Étonnamment, SQL Server ne génère aucune erreur lors de la compilation du sproc. Supprimer la virgule a résolu le problème pour nous.

En résumé, bien que certaines des solutions ci-dessus puissent fonctionner en fonction du problème, ma suggestion est de vérifier dans votre sproc les erreurs syntaxiques que SQL pourrait ignorer mais qui pourraient en être la cause sous-jacente. Merci.

0
Tapan