11

Sto utilizzando Entity Framework 4.1 e talvolta devo chiamare stored procedure. Alcuni di questi restituiscono valori come valori di ritorno. Per esempioCome dovrei restituire un int da una stored procedure in Entity Framework 4.1?

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

(Aggiornamento: valore di ritorno rimosso, non rilevante Stiamo restituendo l'identità.)

ho il seguente codice nella mia classe respository:

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

Questo fallisce con il messaggio di errore The specified cast from a materialized 'System.Decimal' type to the 'System.Int32' type is not valid.

Se cambio il codice sopra a

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

tutto funziona.

Ora, penso che dovrei essere in grado di restituire un int. Qual è il modo corretto per farlo?

+3

Non restituire @@ Identity oppure è possibile che si verifichino comportamenti imprevisti poiché @@ Identity restituisce l'ultimo id indipendentemente dalla sessione. Usa 'SCOPE_IDENTITY()' invece – Icarus

risposta

10

I assumere, sulla base della modifica alla tua domanda - ho cliccato poco dopo il vostro invio, poi rinfrescato un po 'più tardi - che questo è solo un problema quando stai restituendo l'identità?

In tal caso, è un decimale perché @@ IDENTITY (e SCOPE_IDENTITY) restituiscono valori numerici (38,0). Vedere la risposta a questa domanda: Why does select SCOPE_IDENTITY() return a decimal instead of an integer? Come indicato qui, il casting su int deve consentire all'EF di rilevare correttamente il tipo.

7

Non restituire @@Identity o si può incorrere in un comportamento imprevisto dal @@Identity restituisce l'ultimo id indipendentemente dalla sessione. Utilizzare SCOPE_IDENTITY() invece

mi immagino che il ritorno SELECT cast(SCOPE_IDENTITY() as int)

farebbe per voi sul lato C#

4

@@ IDENTITY restituisce un tipo numerico con una precisione del 38 e scala da 0, quindi .NET riconosce correttamente il tuo SP restituisce un decimale. È possibile risolvere questo con l'aggiunta di un cast in SP:

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

Interessante notare che questo non sembra essere un problema quando il server SQL è 2012, ma IS se è 200 R2. Ecco perché mi sono imbattuto in questo argomento. –