Entity Frameworkデータベースファーストアプローチを使用して、プロジェクトのWebフォームからMVCアプリケーションへの移行を行っており、すべてのストアドプロシージャとともにデータベースを準備しています。
.edmx
ファイルを正常に作成し、ストアドプロシージャを使用できました。実行する挿入または更新操作がある場合は、うまく機能しました。しかし、実際の問題は、ストアドプロシージャの1つでselectクエリを使用していたときに発生しました。
たとえば、次の列を持つEmployee
テーブルがあります。
EmpId, FirstName, LastName, Age, Salary
次のselectクエリを持つストアドプロシージャGetAllEmpDetails
があります。
Select
EmpId, (FirstName + ' ' + LastName) as FullName, Salary
from
Employee
このストアドプロシージャの結果を、テーブル構造に従って5つのプロパティを持つEmployee
クラスにバインドしようとすると、Age
プロパティの値が予期されるというエラーが発生します。ただし、結果セットでは使用できません。
FullName
プロパティもないことを知っているので、私の質問は、生成されたモデルクラス(この場合はEmployee
)でこの問題を解決して、これらのダイナミズムに取り組むことができるようにする方法です。
EFでストアドプロシージャをマップする方法は?
データベースファーストアプローチを実行していて、EDMXファイルがあるので、EFにストアドプロシージャの結果のクラスを生成させます。多くのストアドプロシージャがあり、クラスを手動で作成することを避けたい場合があります。結局のところ、それがORMツールを使用することの要点です。また、一部のストアドプロシージャにはパラメータがある場合があります。以下の方法でそれを行うと、すべてが処理されます。 実際にはかなり簡単です。
EFにこれを実行させるには、以下の手順に従います。
以下のようなダイアログが表示されます。
これにより、ストアドプロシージャが追加され、次のようにモデルブラウザに表示されます。
いくつかのメモ
これは、ストアドプロシージャ名、必要なパラメータ、または返される結果が変更された場合に備えて、クラスを手動で作成するよりもはるかに優れています。このアプローチは、ユーザー定義関数でも機能します。
ガッチャ
this が原因で、ストアドプロシージャがウィザードダイアログの選択に表示されない場合があります。これをストアドプロシージャの先頭に追加するだけです。
SET FMTONLY OFF -- REMEMBER to remove it once the wizard is done.
public class EmployeeProcedure
{
[Column("EmpId")]
public int EmployeeId { get; set; }
[NotMapped]
public string FullName { get; set; }
public double Salary { get; set; }
}
その後、これを呼び出します:
this.Database.SqlQuery<EmployeeProcedure>("GetAllEmpDetails");