Skip to content
Perspectivas e Iteraciones Entendiendo la IA: técnico, cotidiano y reflexiones.
← atrás

Llamando Procedimientos Almacenados con Code First

16 de octubre de 2014 • 2 min de lectura

Llamando Procedimientos Almacenados con Code First

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 usado Code-First en Entity Framework (EF), Code-First es simplemente una API de mapeo Fluent. La idea es crear todos los mapeos de tu 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 el Entity Framework tradicional para llamar un procedimiento almacenado lo mapearías en tu archivo EDMX. Este es un proceso de múltiples pasos. Una vez que el proceso se completa, se crea un método que cuelga del DataContext.

Busqué hacer más fácil la llamada a procedimientos almacenados. En el corazón de un procedimiento almacenado tienes 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});
↑ Volver arriba

Autor: Chuck Conway se especializa en ingeniería de software e IA Generativa. Conéctate con él en redes sociales: X (@chuckconway) o visítalo en YouTube.