J'essaie d'utiliser une procédure stockée dans Entity Framework qui ne renvoie rien.
J'ai fait ce qui suit:
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)
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
{
-------------------
}
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
:
(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:
(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:
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.
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.
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?
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.
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
EF ne prend pas en charge l’importation de procédures stockées qui construisent un ensemble de résultats à partir de:
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.
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!
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?
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.
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.