Ajout de procédures stockées types complexes dans le cadre de L'entité

j'essaie d'utiliser une procédure stockée dans un framework Entity qui ne renvoie rien.

j'ai fait ce qui suit:

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

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

mais les classes entity pour les tables et les vues sont toutes créées mais pas pour la procédure stockée.

est-ce que quelqu'un peut donner l'idée pourquoi il n'est pas généré de classe d'entité dans BusinessAccount.web.g.cs ?

mise à jour:

laissez-moi confirmer ReturnDataFromTemTable_result classe d'entité 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
{
   -------------------
 }
31
demandé sur marc_s 2012-10-11 10:32:38

10 réponses

OK-voici la façon de procéder étape par étape:

(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) le dialogue suivant qui apparaît est d'une importance vitale - vous devez (1) Définir que la procédure stockée retourne une collection de types complexes, alors vous devez (2) Obtenir les informations de la colonne de cette procédure stockée pour savoir quelles colonnes il retournera, puis (3) vous dites Visual Studio pour générer un nouveau type complexe basé sur cette information de 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 le navigateur de Modèle, et le le type complexe nouvellement créé devrait apparaître là aussi:

enter image description here

60
répondu marc_s 2012-10-11 07:21:51

Si ceci n'est toujours pas résolu, après avoir ajouté la fonction Import, allez dans L'Explorateur de solutions, faites un clic droit sur votre {nom}.Contexte.TT file and do "Run Custom Tool". La méthode apparaîtra maintenant dans votre classe de contexte dérivé.

enter image description here

cela ressemble à un bug Dans Visual Studio 2012, qui est ce que j'utilise, Je n'ai pas appliqué la mise à jour 1, je vais essayer de voir si cela la corrige.

13
répondu Chris Amelinckx 2015-07-14 14:30:46

C'est pour Ross Brigoli

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

SET FMTONLY OFF Vous pouvez supprimer ce après avoir terminé l'importation.

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

11
répondu Sandeep 2017-05-23 11:47:20

EF ne prend pas en charge l'importation des procédures stockées qui permettent de construire le jeu de résultats à partir de:

  • requêtes dynamiques
  • tables temporaires

réécrivez votre procédure stockée pour utiliser une variable de table à la place. n'oubliez pas de laisser tomber la commande stockée et la fonction Importer de votre modèle avant de mettre à jour car il ne générera pas le type complexe à moins qu'il ajoute également la procédure stockée. ou allez à fonction Importer les propriétés et utilisez la fonction get column information après avoir mis à jour votre procédure stockée.

2
répondu Verard Sloggett 2015-07-30 21:14:47
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
répondu Ambala Chandrashekar 2017-05-05 10:30:45

comme disait Sandeep, EF ne supporte pas l'importation de procédures stockées qui construisent des ensembles de résultats à partir de requêtes dynamiques ou de tables temporaires.

mais vous n'avez pas à réécrire tout votre SP.

il suffit d'en écrire un autre, avec le même nom, qui retourne le format de ligne correct sans utiliser le SQL dynamique ou une table temp. Ensuite, utilisez la fonction D'ajout EF SP, qui va maintenant auto générer le type complexe.

Edit: C'est en fait, plus facile de faire un commentaire en haut de la SP qui sélectionne immédiatement la ligne désirée avec tous les types de données spécifiés avec CASTS. Lorsque vous avez besoin d'importer le SP dans EF, décommentez simplement le code.

p.ex.

procédure de création myProc ()

Comme

BEGIN

-- décommentez la ligne suivante pour importer:

-- SELECT CAST (0 AS int) AS colonne1name, CAST( 'a' varchar(50)) clumn2name

-- commentaire de la SP contenu lorsque vous souhaitez importer.

< contenu SP approprié >

Fin

puis laisser tomber le proc stocké et créer l'original.

Enregistrez ce SP importation temporaire que vous avez fait au cas où vous en avez besoin à nouveau, cependant.

2
répondu Markus 2017-12-04 21:14:22

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 au-dessus de SP dans edmx en utilisant ci-dessous

ajout de procédures stockées types complexes dans le cadre de L'entité

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

et au cas où vous devez mettre à jour votre SP ci-dessous travaillé m'. Mise à jour du type complexe si stocké mises à jour de la procédure Comment Puis-Je Obtenir Le Framework Entity Pour Mettre À Jour Les Types Complexes?

1
répondu Sandeep 2017-05-23 12:03:05

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 D'entité complexe (automatiquement). J'ai trouvé cependant, après avoir commenté des sections de mon sproc (aka procédure stockée), que lorsque j'ai ensuite réimporté la procédure stockée de nouveau dans (c'est-à-dire rafraîchie en utilisant le bouton Obtenir des informations de colonne dans L'écran D'édition de fonction), que le type complexe pourrait alors être généré!

En bref, il pourrait y avoir un où clause (ou peut-être autre chose) empêchant EF de générer le Type complexe. Essayez de commenter les sections de votre sproc et réimportez le sproc au

mise à jour:

suite à mon enquête ci-dessus, j'ai trouvé 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). Pour le plaisir de la curiosité, j'ai changé la vue à une autre table juste pour voir ce qui se passerait, et l'entité complexe générer.

donc, en bref, il semble que les entités complexes ne pourraient 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 en place. Mais maintenant mon code donne des exceptions.

fera une mise à jour plus tard quand j'en apprendrai plus=)

mise à jour:

a réglé le problème. Vraiment stupide erreur! Le viewname que j'étais l'utilisation n'était pas orthographiée à droite =D. Je suis un peu en colère qu'une erreur N'ait pas été lancée par Sql Server quand j'ai créé le sproc..... Je suppose que c'est la vie :) hélas, problème maintenant corrigé!

1
répondu Jeff Moretti 2014-12-15 15:27:29

pour ajouter le type complexe correctement, allez navigateur de modèle, clic droit sur la fonction, puis afficher éditer, cliquez éditer et remplir la boîte de dialogue. Le nom de la fonction doit être la même que le nom de la procédure stockée. Cliquez sur le bouton OK. Maintenant, la fonction est créée. Puis cliquez avec le bouton droit de la souris sur la fonction créée et éditez à nouveau.Il y a un bouton de mise à jour à part du bouton de type complexe.Mettez-le à jour en utilisant ce bouton de mise à jour. Maintenant le type complexe est créé complètement.

0
répondu Thilini 2017-12-20 06:07:30

la question de type complexe ne pas apparaître peut se produire en raison d'une raison différente ainsi que ce qui est ce que j'ai affronté dans notre cas. Le problème était dû à une erreur de syntaxe dans le SPROC où la table de temp a été définie comme ci-dessous - create table #temp( col1 int, col2 de type nvarchar(100), col3 nvarchar (100), -- noter la virgule à la fin ); Étonnamment, SQL Server ne lance aucune erreur lors de la compilation du sproc. Suppression de la virgule fixe le problème pour nous.

En bref, bien que certaines des solutions ci-dessus puissent fonctionner en fonction de la question spécifique, ma suggestion est de vérifier votre sproc pour de telles erreurs syntaxiques que SQL pourrait ignorer mais pourrait être la raison sous-jacente de ce problème. Grâce.

0
répondu Tapan 2018-10-04 08:12:28