Skip to content

文章

使用 Code First 调用存储过程

2014年10月16日 • 2 分钟阅读

使用 Code First 调用存储过程

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

↑ 回到顶部

您可能还喜欢