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:
-
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)
-
mon nom de fonction:
summarySP_Result
. Après la construction du projet la catégorie d'entité n'est pas générée dansGenerated_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
{
-------------------
}
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
:
(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:
(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:
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é.
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.
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.
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.
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
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.
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é
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?
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é!
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.
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.