Resumo : neste tutorial você aprenderá como criar procedimentos armazenados no banco de dados e como executá-los no EF Core.
Criando e executando um procedimento armazenado no EF Core
Para executar um procedimento armazenado no núcleo EF, siga estas etapas:
- Primeiro, crie uma nova migração que gerencie um procedimento armazenado no banco de dados executando o
Add-Migration
comando no Package Console Manager. Na classe de migração gerada, oUp()
método cria um procedimento armazenado enquanto oDown()
método o descarta. - Segundo, execute o
Update-Database
comando para criar o procedimento armazenado no banco de dados. - Terceiro, use o
FromSqlRaw()
método doDbSet
para executar o procedimento armazenado.
Observe que o resultado retornado pelo procedimento armazenado deve ser materializado na entidade correspondente do arquivo DbSet
.
Executando um procedimento armazenado no exemplo principal do EF
Usaremos o projeto de exemplo do EF Core como ponto de partida. E usaremos a Employees
tabela do banco de dados de RH para demonstração:
O procedimento armazenado a seguir retorna funcionários cujos salários estão entre uma faixa:
CREATE PROCEDURE GetEmployeeBySalaryRange(
@MinSalary as decimal,
@MaxSalary as decimal)
AS
BEGIN
SELECT * FROM Employees
WHERE Salary BETWEEN @MinSalary AND @MaxSalary
ORDER BY Salary DESC;
END
GO
Linguagem de código: C# ( cs )
Para executar este procedimento armazenado no núcleo EF:
Primeiro, crie uma nova migração no Console do Gerenciador de Pacotes executando o Add-Migration
comando:
Add-Migration AddGetEmployeeBySalaryRangeSP
Linguagem de código: C# ( cs )
Segundo, modifique the AddGetEmployeeBySalaryRangeSP.cs
no Migrations
diretório da seguinte forma:
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace HR.Migrations
{
/// <inheritdoc />
public partial class AddGetEmployeeBySalaryRangeSP : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
var command = @"CREATE PROCEDURE GetEmployeeBySalaryRange(
@MinSalary as decimal,
@MaxSalary as decimal)
AS
BEGIN
SELECT * FROM Employees
WHERE Salary BETWEEN @MinSalary AND @MaxSalary
ORDER BY Salary DESC;
END
GO";
migrationBuilder.Sql(command);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
var command = "DROP PROCEDURE GetDepartmentSalary";
migrationBuilder.Sql(command);
}
}
}
Linguagem de código: C# ( cs )
O Up()
método usa o Sql()
método do MigrationBuilder
objeto para executar um comando que cria o GetEmployeeBySalaryRange()
procedimento armazenado.
O Down()
método também usa o Sql()
método, mas executa uma instrução que descarta o GetDepartmentSalary
procedimento armazenado.
Terceiro, crie o GetEmployeeBySalaryRange
procedimento armazenado no banco de dados executando Update-Database
no Console do Gerenciador de Pacotes:
Update-Database
Linguagem de código: C# ( cs )
Se você visualizar os procedimentos armazenados no SQL Server, verá que o procedimento armazenado foi criado com sucesso da seguinte maneira:
Por fim, execute o GetEmployeeBySalaryRange
procedimento armazenado do EF Core para obter funcionários com faixa salarial de 100,000
e 120,000
:
using static System.Console;
using HR;
using Microsoft.EntityFrameworkCore;
using var context = new HRContext();
var minSalary = 100_000;
var maxSalary = 120_000;
var employees = context.Employees
.FromSqlRaw("EXECUTE GetEmployeeBySalaryRange {0}, {1}",
minSalary,
maxSalary)
.ToList();
foreach (var e in employees)
{
WriteLine($"{e.FirstName} {e.LastName} - {e.Salary:C0}");
}
Linguagem de código: C# ( cs )
Saída:
Isabella Walker - $119,856
Luke Walker - $118,605
Charlotte King - $117,417
Carter Adams - $113,398
Liam Scott - $108,406
Daniel Lewis - $103,561
Linguagem de código: C# ( cs )
Nos bastidores, o EF Core executa o procedimento armazenado conforme mostrado no log:
-- [Parameters=[p0='100000', p1='120000'], CommandType='Text', CommandTimeout='30']
EXECUTE GetEmployeeBySalaryRange @p0, @p1
Linguagem de código: C# ( cs )
Resumo
- Use migrações para gerenciar procedimentos armazenados.
- Use o
FromSqlRaw()
método para executar o procedimento armazenado no EF Core.