
Entity Framework 6 Code Firstの弱点の一つは、データベース構造(ビュー、ストアドプロシージャなど)をネイティブに呼び出すサポートが不足していることです。Entity Framework(EF)のCode-Firstについて聞いたことがない、または使用したことがない方のために説明すると、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});
著者:Chuck Conwayはソフトウェアエンジニアリングと生成AIを専門としています。ソーシャルメディアで彼とつながりましょう:X (@chuckconway) または YouTube をご覧ください。