Posts
Chamando Procedimentos Armazenados com Code First
16 de outubro de 2014 • 2 min de leitura
Uma das fraquezas do Entity Framework 6 Code First é a falta de suporte para chamar nativamente construções de banco de dados (visualizações, procedimentos armazenados… 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 alterações no esquema do banco de dados.
No Entity Framework tradicional, para chamar um procedimento armazenado você o mapearia em seu arquivo EDMX. Este é um processo de várias etapas. Uma vez que o processo é concluído, um método é criado, que fica vinculado ao DataContext.
Procurei tornar a chamada de um procedimento armazenado mais fácil. No coração de um procedimento armazenado 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. Ele 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 é um Engenheiro de IA com quase 30 anos de experiência em engenharia de software. Ele constrói sistemas de IA práticos—pipelines de conteúdo, agentes de infraestrutura e ferramentas que resolvem problemas reais—e compartilha o que está aprendendo ao longo do caminho. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube e no SubStack.