Skip to content

Posts

Chamando Stored Procedures com Code First

16 de outubro de 2014 • 2 min de leitura

Chamando Stored Procedures com Code First

Uma das fraquezas do Entity Framework 6 Code First é a falta de suporte para chamar nativamente construtos de banco de dados (views, stored procedures… etc). Para aqueles que não ouviram falar ou usaram Code-First no Entity Framework (EF), Code-First é simplesmente uma API de mapeamento Fluent. A ideia é criar todos os seus mapeamentos de banco de dados em código (ou seja, C#) e o framework então cria e rastreia as mudanças no esquema do banco de dados.

No Entity Framework tradicional, para chamar uma stored procedure você a mapearia em seu arquivo EDMX. Este é um processo de múltiplas etapas. Uma vez que o processo é concluído, um método é criado, que fica disponível no DataContext.

Eu busquei tornar a chamada de stored procedure mais fácil. No coração de uma stored procedure você tem um nome de procedimento, N número de parâmetros e um conjunto de resultados. Escrevi um pequeno método de extensão que recebe um nome de procedimento, parâmetros e um tipo de retorno. Simplesmente funciona. Sem mapear o procedimento e seus parâmetros.

public static List<TReturn> CallStoredProcedure<TParameters, TReturn>(this DataContext context, string storedProcedure, TParameters parameters) where TParameters : class where TReturn : class, new()
{
IDictionary<string,object> procedureParameters = new Dictionary<string, object>();
PropertyInfo[] properties = parameters.GetType().GetProperties();

var ps = new List<object>();

foreach (var property in properties)
{
object value = property.GetValue(parameters);
string name = property.Name;

procedureParameters.Add(name, value);

ps.Add(new SqlParameter(name, value));
}

var keys = procedureParameters.Select(p => string.Format("@{0}", p.Key)).ToList();
var parms = string.Join(", ", keys.ToArray());

return context.Database.SqlQuery<TReturn>(storedProcedure + " " + parms, ps.ToArray()).ToList();
}

Uso

var context = new DataContext();

List<User> users = context.CallStoredProcedure<object,User>("User_GetUserById", new{userId = 3});

Autor: Chuck Conway é especialista em engenharia de software e IA Generativa. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube.

↑ Voltar ao topo

Você também pode gostar