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 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 También te puede gustar
- Modificar un Archivo Localmente Sin Actualizar el Repositorio Git Remoto 1 min de lectura
- Una Implementación de Búsqueda Binaria 1 min de lectura
- Los Beneficios de Usar un Framework de Construcción 2 min de lectura