web-dev-qa-db-ja.com

EntityFrameworkデータベースの最初のアプローチでのストアドプロシージャ

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)でこの問題を解決して、これらのダイナミズムに取り組むことができるようにする方法です。

5

EFでストアドプロシージャをマップする方法は?

データベースファーストアプローチを実行していて、EDMXファイルがあるので、EFにストアドプロシージャの結果のクラスを生成させます。多くのストアドプロシージャがあり、クラスを手動で作成することを避けたい場合があります。結局のところ、それがORMツールを使用することの要点です。また、一部のストアドプロシージャにはパラメータがある場合があります。以下の方法でそれを行うと、すべてが処理されます。 実際にはかなり簡単です。

EFにこれを実行させるには、以下の手順に従います。

  1. EDMXファイルをダブルクリックします
  2. データベースからモデルを更新を選択します

以下のようなダイアログが表示されます。

enter image description here

  1. 図のようにチェックボックスがオンになっていることを確認してください。

これにより、ストアドプロシージャが追加され、次のようにモデルブラウザに表示されます。

enter image description here

  1. EFによって自動生成されたクラス名を変更する場合は、変更します。これを実行し、.NET命名規則に従ってクラスに意味のある名前を付けることを強くお勧めします。私が従う規則は、ストアドプロシージャ名から動詞を削除し、Wordの結果を最後に追加することです。したがって、次のような名前になります。

enter image description here

  1. OKを押します

いくつかのメモ

これは、ストアドプロシージャ名、必要なパラメータ、または返される結果が変更された場合に備えて、クラスを手動で作成するよりもはるかに優れています。このアプローチは、ユーザー定義関数でも機能します。

ガッチャ

this が原因で、ストアドプロシージャがウィザードダイアログの選択に表示されない場合があります。これをストアドプロシージャの先頭に追加するだけです。

SET FMTONLY OFF -- REMEMBER to remove it once the wizard is done.
14
CodingYoshi
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");
0