Como executar procedimentos armazenados no EF Core

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-Migrationcomando no Package Console Manager. Na classe de migração gerada, o Up()método cria um procedimento armazenado enquanto o Down()método o descarta.
  • Segundo, execute o Update-Databasecomando para criar o procedimento armazenado no banco de dados.
  • Terceiro, use o FromSqlRaw()método do DbSetpara 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 Employeestabela 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 
GOLinguagem 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-Migrationcomando:

Add-Migration AddGetEmployeeBySalaryRangeSPLinguagem de código:  C#  ( cs )

Segundo, modifique the AddGetEmployeeBySalaryRangeSP.csno Migrationsdiretó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 MigrationBuilderobjeto 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 GetDepartmentSalaryprocedimento armazenado.

Terceiro, crie o GetEmployeeBySalaryRangeprocedimento armazenado no banco de dados executando Update-Databaseno Console do Gerenciador de Pacotes:

Update-DatabaseLinguagem 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:

Procedimento armazenado de execução do EF Core

Por fim, execute o GetEmployeeBySalaryRangeprocedimento armazenado do EF Core para obter funcionários com faixa salarial de 100,000e 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,561Linguagem 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, @p1Linguagem 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *