Agregar procedimientos complejos almacenados en Entity Framework

Estoy tratando de usar un procedimiento almacenado en Entity Framework que no devuelve nada.

Hice lo siguiente:

  1. Se agregó una función (haga clic derecho en el procedimiento almacenado -> agregar -> función importar -> Tipo de complejo -> Obtener información de columna -> crear nuevo tipo complejo)

  2. El nombre de mi función: summarySP_Result . Después de construir el proyecto, la clase de entidad no se genera en Generated_code ( BusinessAccount.web.g.cs )

Pero se crean clases de entidad para tablas y vistas, pero ni para el procedimiento almacenado.

¿Alguien puede dar la idea de por qué no se genera la clase de entidad en BusinessAccount.web.g.cs ?

Actualización:

Permítanme confirmar la clase de entidad ReturnDataFromTemTable_result creada en su clase XXXXXX.web.g.cs .

Me gusta :

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

OK – aquí está la forma paso a paso de hacer esto:

(1) agregue su procedimiento almacenado al archivo EDMX (cuando lo crea por primera vez, o más tarde usando el Update model from database y seleccionando ese procedimiento almacenado)

(2) una vez que tenga el procedimiento almacenado en su modelo, use el Model Browser para agregar una Function Import :

enter image description here

(3) el siguiente cuadro de diálogo que aparece es de vital importancia; necesita (1) definir que el procedimiento almacenado devuelve una colección de tipos complejos, luego necesita (2) obtener la información de la columna de ese procedimiento almacenado para saber qué columnas volverá, luego (3) le dices a Visual Studio que genere un nuevo tipo complejo basado en la información de esa columna:

enter image description here

(4) una vez que hayas hecho eso, ahora deberías ver el procedimiento almacenado en la sección de tu modelo conceptual en el Navegador de modelos, y el tipo complejo recién generado también debería aparecer allí:

enter image description here

Si aún no se ha resuelto, después de agregar la función de importación, vaya al Explorador de soluciones, haga clic con el botón derecho en el archivo {nombre} .Context.tt y haga “Ejecutar herramienta personalizada”. El método ahora aparecerá en su clase de contexto derivado.

enter image description here

Esto parece un error en Visual Studio 2012, que es lo que estoy usando, no he aplicado la Actualización 1, intentaré ver si eso lo corrige.

Esto es para Ross Brigoli

Intente agregar esta línea al comienzo de su procedimiento almacenado:

SET FMTONLY OFF Puede eliminar esto después de que haya terminado de importar.

Fuente: – ¿Por qué no puede Entity Framework ver la información de columna de mi Procedimiento Almacenado?

EF no admite la importación de procedimientos almacenados que generan un conjunto de resultados desde:

  • Consultas dinámicas
  • Tablas temporales

Vuelva a escribir su procedimiento almacenado para usar una variable de tabla en su lugar. recuerde dejar caer la procudure almacenada y la importación de función de su modelo antes de actualizar, ya que no generará el tipo complejo a menos que también agregue el procedimiento almacenado. o vaya a propiedades de importación de funciones y use la función de obtención de información de la columna después de actualizar su procedimiento almacenado.

 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 dijo Sandeep, EF no admite la importación de procedimientos almacenados que generan un conjunto de resultados a partir de consultas dinámicas o tablas temporales.

Pero no tienes que volver a escribir todo tu SP.

Simplemente escriba otra, con el mismo nombre, que devuelva el formato de fila correcto sin usar SQL dynamic o una tabla temporal. Luego use la función de adición EF SP, que ahora generará automáticamente el tipo complejo.

Editar: En realidad, es más fácil hacer un comentario en la parte superior del SP que selecciona inmediatamente la fila deseada con todos los tipos de datos especificados con CASTS. Cuando necesite importar el SP en EF, simplemente elimine el comentario del código.

p.ej

CREAR PROCEDIMIENTO myProc ()
COMO
EMPEZAR
– Descomentar la siguiente fila para importar:
– SELECT CAST (0 AS int) AS column1Name, CAST (‘a’ AS varchar (50)) AS clumn2name

– Comente el contenido de SP cuando quiera importarlo.

FIN

A continuación, suelte el proceso almacenado y cree el original.
Sin embargo, guarde este SP de importación temporal que ha creado en caso de que lo necesite nuevamente.

Este es mi SP para implementar la búsqueda múltiple

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

Ahora puedes consumir arriba de SP en edmx usando debajo

Agregar procedimientos complejos almacenados en Entity Framework

¿Por qué no puede Entity Framework ver la información de columna de mi Procedimiento Almacenado?

Y en caso de que tengas que actualizar tu SP debajo funcionó para mí. Actualización de tipo complejo si se almacena Actualizaciones de procedimiento ¿Cómo obtengo Entity Framework para actualizar los tipos complejos?

En mi caso, tengo problemas con la importación de mi Procedimiento almacenado en EF que no genera el objeto de devolución Entidad compleja (automáticamente). Sin embargo, después de comentar secciones de mi sproc (procedimiento almacenado alias) encontré que cuando reimporté el procedimiento almacenado nuevamente (es decir, actualicé con el botón Obtener información de columna en la pantalla Editar importación de función), ese tipo complejo ¡podría ser generado!

En resumen, podría haber una cláusula where (o tal vez otra cosa) que provoque que EF no genere el Tipo complejo. Intente comentar las secciones de su sproc y vuelva a importar el sproc a

ACTUALIZAR:

Además de mi investigación anterior, descubrí que la razón por la que no se generaba la entidad compleja era porque mi sproc estaba usando una vista (en lugar de una tabla típica). Por curiosidad, cambié la vista a otra tabla solo para ver qué sucedería y la compleja entidad generada.

Entonces, en resumen, parece que las Entidades Complejas pueden no generar automáticamente si tiene una vista. Para intentarlo, arranqué la vista temporalmente, reimporté el sproc, generé la entidad compleja y luego volví a colocar la vista. Pero ahora mi código da excepciones.

Se actualizará más tarde cuando sepa más =)

ACTUALIZAR:

Solucionado el problema. ¡Error realmente tonto! El nombre de vista que estaba usando no se deletreó right = D. Estoy enojado porque el servidor Sql no arrojó un error cuando creé el sproc ….. Supongo que es la vida 🙂 ¡Ay, problema ahora solucionado!

Para agregar un tipo complejo correctamente, vaya a Explorador de modelos, haga clic con el botón derecho en la función, luego visualice editar, haga clic en editar y complete el cuadro de diálogo. El nombre de la función debe ser el mismo que el nombre del procedimiento almacenado. Haga clic en el botón Aceptar. Ahora se crea la función. A continuación, haga clic con el botón derecho en la función creada e ir a editar nuevamente. Hay un botón de actualización a un lado del botón de tipo complejo. Actualícelo con ese botón de actualización. Ahora el tipo complejo se crea completamente.