Entity Framework 4.0 Database First と ASP.NET 4 Web Forms を使用したはじめに - パート 7
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] を展開し、[ストアド プロシージャ] を右クリックして、[新しいストアド プロシージャの追加] を選択します。
次の 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;
Student
エンティティには、および EnrollmentDate
の PersonID
LastName
FirstName
4 つのプロパティがあります。 データベースは 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
選択して、[完了] をクリックします。
ストアド プロシージャのマッピング
データ モデル デザイナーで、エンティティを Student
右クリックし、[ ストアド プロシージャ マッピング] を選択します。
[ マッピングの詳細 ] ウィンドウが表示され、この種類のエンティティの挿入、更新、削除に Entity Framework で使用するストアド プロシージャを指定できます。
Insert 関数を InsertStudent に設定します。 ウィンドウにはストアド プロシージャ パラメーターの一覧が表示されます。各パラメーターはエンティティ プロパティにマップする必要があります。 これらの 2 つの名前は同じであるため、自動的にマップされます。 という名前 FirstName
のエンティティ プロパティがないため、使用可能なエンティティ プロパティを表示するドロップダウン リストから手動で選択 FirstMidName
する必要があります。 (これは、最初のチュートリアルで プロパティの名前を FirstName
に FirstMidName
変更したためです)。
同じ [マッピングの詳細] ウィンドウで、関数をUpdate
ストアド プロシージャにUpdateStudent
マップし (ストアド プロシージャの場合Insert
と同様に、 のパラメーター値FirstName
として を指定FirstMidName
してください)、関数をDelete
DeletePerson
ストアド プロシージャにマップします。
同じ手順に従って、インストラクタのストアド プロシージャの挿入、更新、削除をエンティティに Instructor
マップします。
データを更新するのではなく読み取るストアド プロシージャの場合は、[ モデル ブラウザー] ウィンドウを使用して、ストアド プロシージャを返すエンティティ型にマップします。 データ モデル デザイナーで、デザイン画面を右クリックし、[ モデル ブラウザー] を選択します。 SchoolModel.Store ノードを開き、[ストアド プロシージャ] ノードを開きます。 次に、ストアド プロシージャを GetCourses
右クリックし、[ 関数のインポートの追加] を選択します。
[ 関数のインポートの追加 ] ダイアログ ボックス の [コレクションの取得] で [ エンティティ] を選択し、返されるエンティティの種類として を選択 Course
します。 終わったら [OK] をクリックします。 .edmx ファイルを保存して閉じます。
ストアド プロシージャの挿入、更新、および削除の使用
データを挿入、更新、削除するためのストアド プロシージャは、データ モデルに追加して適切なエンティティにマップした後、Entity Framework によって自動的に使用されます。 StudentsAdd.aspx ページを実行できるようになりました。新しい学生を作成するたびに、Entity Framework はストアド プロシージャをInsertStudent
使用して新しい行をStudent
テーブルに追加します。
Students.aspx ページを実行すると、新しい学生が一覧に表示されます。
名前を変更して更新関数が機能することを確認し、学生を削除して削除関数が機能することを確認します。
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 ページのルールを指定する代わりに、データ モデル メタデータでこのようなルールを指定すると、すべてのページに自動的に適用されます。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示