Beiträge
Aufruf von Stored Procedures mit Code First
16. Oktober 2014 • 2 Min. Lesezeit

Eine der Schwächen von Entity Framework 6 Code First ist die fehlende Unterstützung für den nativen Aufruf von Datenbankkonstrukten (Views, Stored Procedures… etc). Für diejenigen, die noch nichts von Code-First in Entity Framework (EF) gehört oder es verwendet haben: Code-First ist einfach eine Fluent-Mapping-API. Die Idee ist, alle Ihre Datenbank-Mappings im Code (d.h. C#) zu erstellen, und das Framework erstellt dann die Datenbankschema und verfolgt die Änderungen.
Im traditionellen Entity Framework würden Sie eine Stored Procedure in Ihrer EDMX-Datei mappen. Dies ist ein mehrstufiger Prozess. Sobald der Prozess abgeschlossen ist, wird eine Methode erstellt, die am DataContext
hängt.
Ich wollte den Aufruf von Stored Procedures einfacher machen. Im Kern einer Stored Procedure haben Sie einen Prozedurnamen, N Anzahl von Parametern und ein Ergebnisset. Ich habe eine kleine Erweiterungsmethode geschrieben, die einen Prozedurnamen, Parameter und einen Rückgabetyp nimmt. Es funktioniert einfach. Kein Mapping der Prozedur und ihrer Parameter.
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();
}
Verwendung
var context = new DataContext();
List<User> users = context.CallStoredProcedure<object,User>("User_GetUserById", new{userId = 3});
Autor: Chuck Conway ist spezialisiert auf Software-Engineering und Generative KI. Verbinden Sie sich mit ihm in den sozialen Medien: X (@chuckconway) oder besuchen Sie ihn auf YouTube.