Adicionando tipos complexos de stored procedures no Entity Framework

Eu estou tentando usar um procedimento armazenado no Entity Framework que não retorna nada.

Eu fiz o seguinte:

  1. Adicionado uma function (clique com o botão direito no procedimento armazenado -> add -> function import-> Complex Type -> Obter informações da coluna -> create New Complex-Type)

  2. Nome da minha function: summarySP_Result . Depois de construir o projeto, a class de entidade não é gerada em Generated_code ( BusinessAccount.web.g.cs )

Mas as classs de entidade para tabelas e exibições são todas criadas, mas não para o procedimento armazenado.

Alguém pode dar a idéia porque não é gerada class de entidade em BusinessAccount.web.g.cs ?

Atualização:

Deixe-me confirmar a class de entidade ReturnDataFromTemTable_result criada em sua class XXXXXX.web.g.cs .

Gostar :

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

OK – aqui está a maneira passo-a-passo de fazer isso:

(1) adicionar seu procedimento armazenado ao arquivo EDMX (quando você primeiro cria, ou mais tarde usando o Update model from database e escolhendo o procedimento armazenado)

(2) depois de ter o procedimento armazenado em seu modelo – use o Model Browser para adicionar uma Function Import :

insira a descrição da imagem aqui

(3) o próximo diálogo que aparece é de vital importância – você precisa (1) definir que o procedimento armazenado retorna uma coleção de tipos complexos, então você precisa (2) obter as informações da coluna daquele procedimento armazenado para saber quais colunas ele retornará e, em seguida, (3) você informará ao Visual Studio para gerar um novo tipo complexo com base nas informações dessa coluna:

insira a descrição da imagem aqui

(4) depois de fazer isso, você deve ver o procedimento armazenado em sua seção de modelo conceitual no Model Browser, e o tipo complexo recém-gerado também deve aparecer lá:

insira a descrição da imagem aqui

Se isso ainda não foi resolvido, depois de adicionar a importação de function, vá para o Solution Explorer, clique com o botão direito do mouse no arquivo {name} .Context.tt e execute “Run Custom Tool”. O método agora aparecerá na sua class Contexto derivada.

insira a descrição da imagem aqui

Isso parece um bug no Visual Studio 2012, que é o que estou usando, eu não apliquei a Atualização 1, vou tentar ver se isso corrige isso.

Isto é para Ross Brigoli

Tente adicionar essa linha ao início do procedimento armazenado:

SET FMTONLY OFF Você pode remover isso após terminar de importar.

Fonte: – Por que o Entity Framework não consegue ver as informações da coluna do meu Procedimento Armazenado?

O EF não suporta a importação de stored procedures que compõem o conjunto de resultados de:

  • Consultas dinâmicas
  • Tabelas temporárias

Reescreva seu procedimento armazenado para usar uma variável de tabela. Lembre-se de descartar o procuduro armazenado e a importação de function do seu modelo antes de atualizar, pois ele não gerará o tipo complexo, a menos que também adicione o procedimento armazenado. ou acesse as propriedades de importação e use o recurso de informações da coluna get após atualizar seu procedimento armazenado.

 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 

Como Sandeep disse, o EF não suporta a importação de stored procedures que compõem o conjunto de resultados de consultas dinâmicas ou tabelas temporárias.

Mas você não precisa rewrite todo o seu SP.

Basta escrever outro, com o mesmo nome, que retorna o formato de linha correto sem usar SQL dynamic ou uma tabela temporária. Em seguida, use a function de adição do EF SP, que agora gerará automaticamente o tipo complexo.

Edit: É realmente mais fácil fazer um comentário no topo do SP que imediatamente seleciona a linha desejada com todos os tipos de dados especificados com CASTS. Quando você precisar importar o SP para o EF, descomente o código.

por exemplo

CRIAR PROCEDIMENTO myProc ()
COMO
INÍCIO
– descomente a linha a seguir para importar:
– SELECT CAST (0 AS int) como column1Name, CAST (‘a’ como varchar (50)) como clumn2name

– Comente o conteúdo do SP quando quiser importá-lo.

FIM

Em seguida, elimine o procedimento armazenado e crie o original.
Salve este SP de importação temporário que você fez no caso de precisar dele novamente.

Este é o meu SP para implementar a pesquisa múltipla

 *************************************************** 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 

Agora você pode consumir acima de SP no edmx usando abaixo

Adicionando tipos complexos de stored procedures no Entity Framework

Por que o Entity Framework não pode ver as informações da coluna do meu Procedimento Armazenado?

E no caso de você ter que atualizar seu SP abaixo funcionou para mim. Atualizando tipo complexo se Stored Procedure Updates Como faço para obter o Entity Framework para atualizar tipos complexos?

Para mim, estou tendo problemas onde importar meu procedimento armazenado para o EF não está gerando o object de retorno de entidade complexa (automaticamente). Eu encontrei no entanto, depois de comentar seções do meu sproc (procedimento armazenado aka), que quando eu reimportou o procedimento armazenado novamente (ou seja, atualizado usando o botão Obter informações da coluna na canvas de edição Import Import), que o tipo complexo poderia então ser gerado!

Em suma, poderia haver uma cláusula where (ou talvez outra coisa) fazendo com que EF não gerasse o tipo complexo. Tente comentar seções do seu sproc e reimportar o sproc para

ATUALIZAR:

Além da minha investigação acima, descobri que a razão pela qual a Entidade Complexa não estava sendo gerada era porque meu sproc estava usando uma visão (em vez de uma tabela típica). Por curiosidade, mudei a visão para outra tabela apenas para ver o que aconteceria e a entidade complexa gerada.

Então, em resumo, parece que Entidades Complexas podem não gerar automaticamente se você tiver uma visão. Para tentar, tirei a visualização temporariamente, reimportei o sproc, gerou a Entidade Complexa e, em seguida, coloquei a vista de volta. Mas agora meu código fornece exceções.

Vai atualizar isso mais tarde, quando eu aprender mais =)

ATUALIZAR:

Corrigido o problema. Erro realmente bobo! O viewname que eu estava usando não foi escrito corretamente = D. Im tipo de raiva que um erro não foi lançado pelo Sql Server quando eu criei o sproc ….. Eu acho que é a vida 🙂 Ai, problema corrigido agora!

Para adicionar o tipo complexo corretamente, acesse o navegador Modelo, clique com o botão direito do mouse na function e, em seguida, exiba a edição, clique em editar e preencha a checkbox de diálogo. O nome da function deve ser igual ao nome do procedimento armazenado. Clique no botão OK. Agora a function é criada. Em seguida, clique com o botão direito na function criada e vá editar novamente. Há um botão de atualização além do tipo complexo button.Update-lo usando esse botão de atualização. Agora tipo complexo é criado completamente.