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.
Respostas:
Solução (graças a David Browne, você deveria publicá-la como resposta):
Substituir Single por ToList funciona :-)
fonte
Você pode adicionar vários parâmetros, se necessário. Nota:
fonte
Não estou onde posso testar, mas acho que o seguinte funcionará:
fonte
tente separar SqlParameter:
fonte
É extremamente estranho ... pouco antes de alguns dias atrás, tenho o mesmo problema e sigo este post. Eu recebi esta ligação:
No momento, está tudo bem e esta chamada funciona como esperado. Portanto, devo admitir que não há problema com o retorno de conjuntos de dados e parâmetros para EF no Core 3.
fonte
Dê uma olhada aqui:
https://github.com/DarioN1/SPToCore
Este é um andaime para procedimento armazenado, ele pode ajudá-lo a trabalhar com sp.
Não é uma biblioteca de terceiros, ele gerou código c # puro para incluir no seu projeto que estende o dbContext atual para fornecer métodos de procedimentos armazenados, mapeamento de parâmetros e resultados classificados.
fonte