web-dev-qa-db-ja.com

EFによってMVCでストアドプロシージャを呼び出す方法

MVCフレームワークのストアドプロシージャを使用したEntityフレームワークの優れたチュートリアルはどこで入手できますか?

この場合、ほとんどすべてがストアドプロシージャに記述されているので、エンタープライズライブラリを使用する方がよいでしょうか。

注:ストアドプロシージャを使用しているのは、それらが非常に複雑で、1000行を超えるものもあるためです。

11
Chris

この場合、MVCはまったく関係ありません。 EFからストアドプロシージャを呼び出す方法は同じです。エンティティやlinq-to-entities(EFの主な機能)を実際に使用せずに、ストアドプロシージャを使用したいと思いませんか?一般的に必要なもの:

  • データベースから更新を実行し、使用するすべてのストアドプロシージャを追加するEDMXファイル(ado.netエンティティデータモデル)。 EDMXファイルは、デフォルトで派生ObjectContextとすべてのエンティティも生成します。
  • 次に、手順ごとに モデルブラウザと関数インポートの作成 に移動する必要があります。関数importは、派生したObjectContextにメソッドを作成します。これにより、他の.netメソッドと同じようにストアドプロシージャを呼び出すことができます。
  • 関数のインポート中に、ストアドプロシージャから返される結果セットの複合型を作成する必要があります(自動的に発生する可能性があります)。

また、関数のインポートを使用する必要はまったくありません。 プロシージャを直接実行できます 次のいずれかを呼び出します。

  • objectContext.ExecuteSqlCommand("storedProcedureName", SqlParameters)SPがレコードセットを返さない場合
  • レコードセットを返すSPの場合はobjectContext.ExecuteStoreQuery<ResultType>("storedProcedureName", SqlParameters)ResultTypeには、結果セットの列と同じ名前のプロパティが必要です。フラットタイプでのみ機能します(ネストされたオブジェクトはありません)。

ストアドプロシージャを使用する場合、いくつかの制限があります。

  • Entity Frameworkは、動的な結果セットを返すストアドプロシージャを好みません(いくつかの条件に基づいて、結果セットには異なる列があります)
  • Entity Frameworkは、複数の結果セットを返すストアドプロシージャをサポートしていません。サポートしているのは EFExtensions ですが、ADO.NETを直接実行するようなものです。
41
Ladislav Mrnka

Entity Frameworkコードファーストを使用している場合、この方法でストアドプロシージャを使用できます。この例では、4つの入力パラメーターがあります。

var startDateTY = masterSales.PolicyStartDate;
var endateTY = masterSales.PolicyEndDate;
var startDatePY = masterSales.PolicyStartDate.Value.AddYears(-1);
var endatePY = masterSales.PolicyEndDate.Value.AddYears(-1);

var spParameters = new object[4];
spParameters[0] = new SqlParameter()
{
     ParameterName = "startDateTY",
     Value = startDateTY
};
spParameters[1] = new SqlParameter()
{
     ParameterName = "endateTY",
     Value = endateTY
};
spParameters[2] = new SqlParameter()
{
     ParameterName = "startDatePY",
     Value = startDatePY
};
spParameters[3] = new SqlParameter()
{
     ParameterName = "endatePY",
     Value = endatePY
};
var datalist = objContext.Database.SqlQuery<vMasterSalesAgentReport>("dbo.usp_GetSalesAgentReport @startDateTY,@endateTY,@startDatePY,@endatePY", spParameters).ToList();
1
Smit Patel
store = "sp_selectmark @regid='" + id + "'";
var st = db.ExecuteStoreQuery<Sp>("exec " + store).ToList();
GridView1.DataSource = st;
GridView1.DataBind();

または

string store = "";
store = "sp_inserttbreg @name='" + regobj.name + "',@age='" + regobj.age + "',@place='" + regobj.place + "',@gender='" + regobj.gender + "',@email='" + regobj.email + "',@fon='" + regobj.fon + "'";
0
samir