Publicaciones
Llamando Procedimientos Almacenados con Code First
16 de octubre de 2014 • 2 min de lectura
Una de las debilidades de Entity Framework 6 Code First es la falta de soporte para llamar nativamente a construcciones de base de datos (vistas, procedimientos almacenados… etc). Para aquellos que no han oído hablar o utilizado Code-First en Entity Framework (EF), Code-First es simplemente una API de mapeo Fluent. La idea es crear todos sus mapeos de base de datos en código (es decir, C#) y el framework luego crea y rastrea los cambios en el esquema de la base de datos.
En Entity Framework tradicional para llamar a un procedimiento almacenado, lo mapearía en su archivo EDMX. Este es un proceso de varios pasos. Una vez completado el proceso, se crea un método que cuelga del DataContext.
Busqué hacer que llamar a un procedimiento almacenado fuera más fácil. En el corazón de un procedimiento almacenado tiene un nombre de procedimiento, N número de parámetros y un conjunto de resultados. He escrito un pequeño método de extensión que toma un nombre de procedimiento, parámetros y un tipo de retorno. Simplemente funciona. Sin mapear el procedimiento y sus 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 es un Ingeniero de IA con casi 30 años de experiencia en ingeniería de software. Construye sistemas de IA prácticos—canalizaciones de contenido, agentes de infraestructura y herramientas que resuelven problemas reales—y comparte lo que está aprendiendo en el camino. Conéctate con él en redes sociales: X (@chuckconway) o visítalo en YouTube y en SubStack.