11

Estoy utilizando Entity Framework 4.1 y algunas veces necesito llamar a procedimientos almacenados. Algunos de estos regresan como valores de retorno. Por ejemplo¿Cómo debo devolver un int de un procedimiento almacenado en entity framework 4.1?

CREATE PROCEDURE ... 
... 
INSERT INTO ... 
SELECT @@Identity 

(actualización: valor de retorno eliminado, no es relevante Estamos volviendo a la identidad.)

tengo el siguiente código en mi clase de repositorio:

var orderNo = context.Database.SqlQuery<int>("EXEC myProc").Single(); 

Este falla con el mensaje de error The specified cast from a materialized 'System.Decimal' type to the 'System.Int32' type is not valid.

Si cambio el código anterior a

var orderNo = context.Database.SqlQuery<decimal>("EXEC myProc").Single(); 

todo funciona.

Ahora, creo que debería poder devolver un int. ¿Cuál es la forma correcta de hacer esto?

+3

No devuelva @@ Identity o puede encontrarse con un comportamiento inesperado ya que @@ Identity devuelve la última identificación independientemente de la sesión. Use 'SCOPE_IDENTITY()' en su lugar – Icarus

Respuesta

10

que asumen, en base a la edición en su pregunta - He hecho clic en él poco después de su publicación, a continuación, refrescado un poco más tarde - que esto es sólo un problema cuando estás devolviendo la identidad?

Si es así, es un decimal porque @@ IDENTITY (y SCOPE_IDENTITY) devuelven un valor numérico (38,0). Vea la respuesta a esta pregunta: Why does select SCOPE_IDENTITY() return a decimal instead of an integer? Como se indicó allí, la conversión a int debería permitir que el EF detecte correctamente el tipo.

7

No devuelva @@Identity o puede encontrar un comportamiento inesperado ya que @@Identity devuelve la última identificación independientemente de la sesión. Utilice SCOPE_IDENTITY() lugar

Me imagino que volver SELECT cast(SCOPE_IDENTITY() as int)

haría por ti en el lado C#

4

@@ IDENTITY devuelve un tipo numérico con una precisión del 38 y la escala de 0, por lo reconoce correctamente .NET su SP como devuelve un decimal. Puede solucionar este problema mediante la adición de un molde en su SP:

CREATE PROCEDURE ... 
... 
INSERT INTO ... 
SELECT CAST(@@Identity as int) 
+0

Es interesante observar que esto no parece ser un problema cuando el servidor SQL es 2012, pero IS si es 200 R2. Por eso me encontré con este tema. –

Cuestiones relacionadas