Migrei recentemente do EF Core 2.2 para o EF Core 3.0.
Infelizmente, não encontrei uma maneira de chamar um procedimento armazenado que retorna uma entidade.
No EF Core 2.0, era possível:
var spParams = new object[] { "bla", "xx" };
var createdPath = ModelContext.Paths.FromSql("AddNodeWithPathProc @p0, @p1", spParams).Single();
No EF Core 3.0, o método FromSQL
é substituído por FromSqlRaw
. No entanto, não consegui chamar com êxito um procedimento armazenado e depois processar o valor. Isso é útil quando o procedimento armazenado insere dados no banco de dados.
Então, no EF Core 3.0, eu uso este código:
var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc @p0, @p1", spParams).Single();
mas lançará uma exceção, porque o SQL gerado é inválido e se parece com isso:
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'
Eu tentei algumas variações, mas sem sucesso.
Estou começando a pensar que não é possível executar procedimentos armazenados com ModelContext.[IQueryable].FromSqlRaw
. Na minha opinião, esse tipo derrota uma das principais razões FromSqlRaw
porque, para instruções de seleção normais, o LINQ é normalmente bom o suficiente.
Alguém sabe como usar procedimentos armazenados em combinação com FromSqlRaw
EF Core 3.0? Qualquer ajuda é muito apreciada.
desde já, obrigado
PS: Eu sei que você pode executar um procedimento armazenado com this.Database.ExecuteSqlRaw(SQL, parameters)
. No entanto, dessa forma, não é possível recuperar nenhuma entidade consultada pelo procedimento armazenado.