Recientemente migré de EF Core 2.2 a EF Core 3.0.
Desafortunadamente, no he encontrado una manera de llamar a un procedimiento almacenado que devuelve una entidad.
En EF Core 2.0 fue posible:
var spParams = new object[] { "bla", "xx" };
var createdPath = ModelContext.Paths.FromSql("AddNodeWithPathProc @p0, @p1", spParams).Single();
En EF Core 3.0, el método FromSQL
se reemplaza por FromSqlRaw
. Sin embargo, no logré llamar con éxito a un procedimiento almacenado y luego procesar el valor. Esto es útil cuando el procedimiento almacenado inserta datos en la base de datos.
Entonces, en EF Core 3.0, uso este código:
var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc @p0, @p1", spParams).Single();
pero arrojará una excepción, porque el SQL generado no es válido y se ve así:
exec sp_executesql N'SELECT TOP(2) [p].[PathId], [p].[Level], [p].[NodeId], [p].[NodePath], [p].[NodePathString]
FROM (
@sql @p0, @p1
) AS [p]',N'@p0 nvarchar(4000),@p1 nvarchar(4000), @sql nvarchar(100)',@p0=N'1a',@p1=N'', @sql=N'AddNodeWithPathProc'
Intenté algunas variaciones, pero sin éxito.
Estoy empezando a pensar que no es posible ejecutar procedimientos almacenados con ModelContext.[IQueryable].FromSqlRaw
. En mi opinión, este tipo derrota una de las principales razones FromSqlRaw
porque, para las declaraciones de selección normales, LINQ es normalmente lo suficientemente bueno.
¿Alguien sabe cómo usar procedimientos almacenados en combinación con FromSqlRaw
EF Core 3.0? Cualquier ayuda es muy apreciada.
Gracias por adelantado
PD: Sé que puedes ejecutar un procedimiento almacenado con this.Database.ExecuteSqlRaw(SQL, parameters)
. Sin embargo, de esa manera no es posible recuperar las entidades que el procedimiento almacenado consulta.
Respuestas:
Solución (gracias a David Browne, debería haberlo publicado como respuesta):
Reemplazar Single con ToList funciona :-)
fuente
Puede agregar múltiples parámetros si es necesario. Nota:
fuente
No estoy donde puedo probar, pero creo que lo siguiente funcionará:
fuente
intenta separar SqlParameter:
fuente
Es extremadamente extraño ... justo antes de hace unos días tengo el mismo problema y sigo esta publicación. Tuve esta llamada:
En este momento todo está bien y esta llamada funciona como se esperaba. Por lo tanto, debo admitir que no hay ningún problema con los conjuntos de datos y el retorno de parámetros para EF en Core 3.
fuente
Echa un vistazo aquí:
https://github.com/DarioN1/SPToCore
Este es un andamio para el procedimiento almacenado, puede ayudarlo a trabajar con sp.
No es una biblioteca de una tercera parte, generó un código puro de C # para incluir en su proyecto que extiende dbContext actual para proporcionar métodos de procedimientos almacenados, asignación de parámetros y resultados clasificados.
fuente