
Entity Framework 6 Code First 的一个弱点是缺乏对原生调用数据库构造(视图、存储过程等)的支持。对于那些没有听说过或使用过 Entity Framework (EF) 中的 Code-First 的人来说,Code-First 简单来说就是一个流畅的映射 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});
作者:Chuck Conway 专注于软件工程和生成式人工智能。在社交媒体上与他联系:X (@chuckconway) 或访问他的 YouTube。