Entity Framework 4.0 Database First と ASP.NET 4 Web Forms を使用したはじめに - パート 7

作成者: Tom Dykstra

Contoso University サンプル Web アプリケーションは、Entity Framework 4.0 と Visual Studio 2010 を使用して ASP.NET Web Forms アプリケーションを作成する方法を示しています。 チュートリアル シリーズの詳細については、シリーズの最初のチュートリアルを参照してください

ストアド プロシージャの使用

前のチュートリアルでは、階層ごとのテーブル継承パターンを実装しました。 このチュートリアルでは、ストアド プロシージャを使用してデータベース アクセスをより詳細に制御する方法について説明します。

Entity Framework では、データベース アクセスにストアド プロシージャを使用することを指定できます。 任意のエンティティ型に対して、その型のエンティティの作成、更新、または削除に使用するストアド プロシージャを指定できます。 次に、データ モデルで、エンティティのセットの取得などのタスクを実行するために使用できるストアド プロシージャへの参照を追加できます。

ストアド プロシージャの使用は、データベース アクセスに関する一般的な要件です。 場合によっては、データベース管理者は、セキュリティ上の理由から、すべてのデータベース アクセスがストアド プロシージャを通過することを要求する場合があります。 それ以外の場合は、Entity Framework がデータベースを更新するときに使用する一部のプロセスにビジネス ロジックを組み込む必要があります。 たとえば、エンティティが削除されるたびに、それをアーカイブ データベースにコピーできます。 または、行が更新されるたびに、変更を行ったユーザーを記録する行をログ テーブルに書き込む必要があります。 Entity Framework がエンティティを削除またはエンティティを更新するたびに呼び出されるストアド プロシージャで、これらの種類のタスクを実行できます。

前のチュートリアルと同様に、新しいページは作成しません。 代わりに、既に作成したページの一部について、Entity Framework がデータベースにアクセスする方法を変更します。

このチュートリアルでは、エンティティと Instructor エンティティを挿入するためのストアド プロシージャをStudentデータベースに作成します。 それらをデータ モデルに追加し、Entity Framework でデータベースに エンティティと Instructor エンティティを追加Studentするために使用するように指定します。 また、エンティティの取得 Course に使用できるストアド プロシージャも作成します。

データベースでのストアド プロシージャの作成

(このチュートリアルでダウンロード可能なプロジェクトの School.mdf ファイルを使用している場合は、ストアド プロシージャが既に存在するため、このセクションをスキップできます)。

[サーバー エクスプローラー] で [School.mdf] を展開し、[ストアド プロシージャ] を右クリックして、[新しいストアド プロシージャの追加] を選択します。

image15

次の SQL ステートメントをコピーし、それらをストアド プロシージャ ウィンドウに貼り付け、スケルトン ストアド プロシージャを置き換えます。

CREATE PROCEDURE [dbo].[InsertStudent]
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @EnrollmentDate datetime
    AS
    INSERT INTO dbo.Person (LastName, 
                FirstName, 
                EnrollmentDate)
    VALUES (@LastName, 
        @FirstName, 
        @EnrollmentDate);
    SELECT SCOPE_IDENTITY() as NewPersonID;

image14

Studentエンティティには、および EnrollmentDatePersonIDLastNameFirstName4 つのプロパティがあります。 データベースは ID 値を自動的に生成し、ストアド プロシージャは他の 3 つのパラメーターを受け取ります。 ストアド プロシージャは、新しい行のレコード キーの値を返して、Entity Framework がメモリに保持するエンティティのバージョンでその値を追跡できるようにします。

ストアド プロシージャ ウィンドウを保存して閉じます。

次の SQL ステートメントを InsertInstructor 使用して、同じ方法でストアド プロシージャを作成します。

CREATE PROCEDURE [dbo].[InsertInstructor]
        @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime
    AS
    INSERT INTO dbo.Person (LastName, 
                FirstName, 
                HireDate)
    VALUES (@LastName, 
        @FirstName, 
        @HireDate);
    SELECT SCOPE_IDENTITY() as NewPersonID;

および Instructor エンティティのStudentストアド プロシージャも作成Updateします。 (データベースにはDeletePerson、エンティティと Student エンティティの両方Instructorに対して機能するストアド プロシージャが既に用意されています)。

CREATE PROCEDURE [dbo].[UpdateStudent]
    @PersonID int,
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @EnrollmentDate datetime
    AS
    UPDATE Person SET LastName=@LastName, 
            FirstName=@FirstName,
            EnrollmentDate=@EnrollmentDate
    WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
    @PersonID int,
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime
    AS
    UPDATE Person SET LastName=@LastName, 
            FirstName=@FirstName,
            HireDate=@HireDate
    WHERE PersonID=@PersonID;

このチュートリアルでは、エンティティの種類ごとに 3 つの関数 (挿入、更新、削除) をすべてマップします。 Entity Framework バージョン 4 では、これらの関数の 1 つまたは 2 つのみをストアド プロシージャにマップできます。ただし、1 つの例外があります。更新関数をマップしても削除関数をマップしない場合、エンティティを削除しようとすると Entity Framework によって例外がスローされます。 Entity Framework バージョン 3.5 では、ストアド プロシージャのマッピングにそれほど柔軟性がありませんでした。1 つの関数をマップした場合は、3 つすべてをマップする必要がありました。

データを更新するのではなく読み取るストアド プロシージャを作成するには、次の SQL ステートメントを使用して、すべての Course エンティティを選択するストアド プロシージャを作成します。

CREATE PROCEDURE [dbo].[GetCourses]
            AS
            SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course

ストアド プロシージャをデータ モデルに追加する

ストアド プロシージャはデータベースで定義されましたが、Entity Framework で使用できるようにするには、データ モデルに追加する必要があります。 SchoolModel.edmx を開き、デザイン画面を右クリックし、[データベースからモデルを更新] を選択します。 [データベース オブジェクトの選択] ダイアログ ボックスの [追加] タブで、[ストアド プロシージャ] を展開し、新しく作成したストアド プロシージャとストアド プロシージャをDeletePerson選択して、[完了] をクリックします

image20

ストアド プロシージャのマッピング

データ モデル デザイナーで、エンティティを Student 右クリックし、[ ストアド プロシージャ マッピング] を選択します。

image21

[ マッピングの詳細 ] ウィンドウが表示され、この種類のエンティティの挿入、更新、削除に Entity Framework で使用するストアド プロシージャを指定できます。

image22

Insert 関数を InsertStudent に設定します。 ウィンドウにはストアド プロシージャ パラメーターの一覧が表示されます。各パラメーターはエンティティ プロパティにマップする必要があります。 これらの 2 つの名前は同じであるため、自動的にマップされます。 という名前 FirstNameのエンティティ プロパティがないため、使用可能なエンティティ プロパティを表示するドロップダウン リストから手動で選択 FirstMidName する必要があります。 (これは、最初のチュートリアルで プロパティの名前を FirstNameFirstMidName 変更したためです)。

image23

同じ [マッピングの詳細] ウィンドウで、関数をUpdateストアド プロシージャにUpdateStudentマップし (ストアド プロシージャの場合Insertと同様に、 のパラメーター値FirstNameとして を指定FirstMidNameしてください)、関数をDeleteDeletePersonストアド プロシージャにマップします。

image01

同じ手順に従って、インストラクタのストアド プロシージャの挿入、更新、削除をエンティティに Instructor マップします。

image02

データを更新するのではなく読み取るストアド プロシージャの場合は、[ モデル ブラウザー] ウィンドウを使用して、ストアド プロシージャを返すエンティティ型にマップします。 データ モデル デザイナーで、デザイン画面を右クリックし、[ モデル ブラウザー] を選択します。 SchoolModel.Store ノードを開き、[ストアド プロシージャ] ノードを開きます。 次に、ストアド プロシージャを GetCourses 右クリックし、[ 関数のインポートの追加] を選択します。

image24

[ 関数のインポートの追加 ] ダイアログ ボックス の [コレクションの取得] で [ エンティティ] を選択し、返されるエンティティの種類として を選択 Course します。 終わったら [OK] をクリックします。 .edmx ファイルを保存して閉じます。

image25

ストアド プロシージャの挿入、更新、および削除の使用

データを挿入、更新、削除するためのストアド プロシージャは、データ モデルに追加して適切なエンティティにマップした後、Entity Framework によって自動的に使用されます。 StudentsAdd.aspx ページを実行できるようになりました。新しい学生を作成するたびに、Entity Framework はストアド プロシージャをInsertStudent使用して新しい行をStudentテーブルに追加します。

image03

Students.aspx ページを実行すると、新しい学生が一覧に表示されます。

image04

名前を変更して更新関数が機能することを確認し、学生を削除して削除関数が機能することを確認します。

image05

Select ストアド プロシージャの使用

Entity Framework では、 などの GetCoursesストアド プロシージャは自動的に実行されず、コントロールで EntityDataSource 使用することはできません。 それらを使用するには、コードから呼び出します。

InstructorsCourses.aspx.cs ファイルを開きます。 メソッドは PopulateDropDownLists LINQ-to-Entities クエリを使用してすべてのコース エンティティを取得し、リストをループ処理して、インストラクターが割り当てられているエンティティと割り当てられていないエンティティを決定できるようにします。

var allCourses = (from c in context.Courses
                  select c).ToList();

これを次のコードに置き換えます。

var allCourses = context.GetCourses();

このページでは、ストアド プロシージャを GetCourses 使用してすべてのコースの一覧を取得するようになりました。 ページを実行して、以前と同じように動作することを確認します。

(ストアド プロシージャによって取得されたエンティティのナビゲーション プロパティには、既定の設定によっては、それらのエンティティに関連するデータが自動的に ObjectContext 設定されない場合があります。詳細については、MSDN ライブラリの 「関連オブジェクトの読み込み 」を参照してください。

次のチュートリアルでは、動的データ機能を使用して、データの書式設定と検証ルールのプログラミングとテストを容易にする方法について説明します。 データ書式指定文字列やフィールドが必要かどうかなど、各 Web ページのルールを指定する代わりに、データ モデル メタデータでこのようなルールを指定すると、すべてのページに自動的に適用されます。