Articles
Appeler des procédures stockées avec Code First
16 octobre 2014 • 2 min de lecture

Une des faiblesses d’Entity Framework 6 Code First est le manque de support natif pour appeler les constructions de base de données (vues, procédures stockées… etc). Pour ceux qui n’ont pas entendu parler ou utilisé Code-First dans Entity Framework (EF), Code-First est simplement une API de mappage Fluent. L’idée est de créer tous vos mappages de base de données dans le code (c’est-à-dire C#) et le framework crée ensuite et suit les changements dans le schéma de base de données.
Dans Entity Framework traditionnel, pour appeler une procédure stockée, vous la mappez dans votre fichier EDMX. C’est un processus en plusieurs étapes. Une fois le processus terminé, une méthode est créée, qui dépend du DataContext
.
J’ai cherché à rendre l’appel d’une procédure stockée plus facile. Au cœur d’une procédure stockée, vous avez un nom de procédure, N nombre de paramètres et un ensemble de résultats. J’ai écrit une petite méthode d’extension qui prend un nom de procédure, des paramètres et un type de retour. Ça marche tout simplement. Pas de mappage de la procédure et de ses paramètres.
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();
}
Utilisation
var context = new DataContext();
List<User> users = context.CallStoredProcedure<object,User>("User_GetUserById", new{userId = 3});
Auteur : Chuck Conway se spécialise dans l’ingénierie logicielle et l’IA générative. Connectez-vous avec lui sur les réseaux sociaux : X (@chuckconway) ou visitez-le sur YouTube.