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.