
Одной из слабостей Entity Framework 6 Code First является отсутствие поддержки нативного вызова конструкций базы данных (представления, хранимые процедуры и т.д.). Для тех, кто не слышал или не использовал Code-First в Entity Framework (EF), Code-First - это просто Fluent API для маппинга. Идея заключается в создании всех маппингов базы данных в коде (например, C#), а фреймворк затем создает и отслеживает изменения в схеме базы данных.
В традиционном Entity Framework для вызова хранимой процедуры вы бы сопоставили её в вашем EDMX файле. Это многоэтапный процесс. После завершения процесса создается метод, который привязывается к DataContext
.
Я стремился упростить вызов хранимых процедур. В основе хранимой процедуры у вас есть имя процедуры, N количество параметров и набор результатов. Я написал небольшой метод расширения, который принимает имя процедуры, параметры и тип возвращаемого значения. Он просто работает. Никакого маппинга процедуры и её параметров.
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();
}
Использование
var context = new DataContext();
List<User> users = context.CallStoredProcedure<object,User>("User_GetUserById", new{userId = 3});
Автор: Чак Конвей специализируется на разработке программного обеспечения и генеративном ИИ. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube.