チュートリアル: Course Manager Web アプリケーションの作成 (Entity Data Model ツール)

このトピックでは、Entity Framework を使用する基本的な ASP.NET アプリケーションの作成方法について説明します。 作成するアプリケーション (CourseManagerWeb) は、ADO.NET Entity Framework クイック スタートの Course Manager Windows フォーム アプリケーションによく似ています。

前提条件

このチュートリアルを完了するには、次のソフトウェアがインストールされている必要があります。

  • Microsoft Visual Studio 2010。

  • School サンプル データベース。 この小さなデータベースを作成する方法の詳細については、「Creating the School Sample Database」を参照してください。

このチュートリアルでは、Visual Studio、.NET Framework、および Visual C# または Visual Basic のプログラミングの基本的なスキルがある読者を想定しています。

ソリューションの作成

このアプリケーションは、ASP.NET Web アプリケーション プロジェクトに基づいています。

Visual Studio で CourseManagerWeb ソリューションを作成するには

  1. Visual Studio の [ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。

    [新しいプロジェクト] ダイアログ ボックスが表示されます。

  2. [プロジェクトの種類] ペインで、[Visual Basic] または [Visual C#] を選択します。 [テンプレート] の種類に [ASP.NET Web アプリケーション] を指定し、名前を「CourseManagerWeb」と入力します。

  3. [OK] をクリックします。

  4. ソリューションが生成されたことと、Default.aspx ファイルおよび Web.config ファイルがソリューションに含まれていることを確認します。

School .edmx ファイルの生成

このアプリケーションは、ASP.NET コントロールを Entity Framework 概念モデルにバインドしてデータを表示します。

School .edmx ファイルを生成するには

  1. ソリューション エクスプローラーで、CourseManagerWeb プロジェクトを右クリックして [追加] をポイントし、[新しい項目] をクリックします。

  2. [テンプレート] ペインの [ADO.NET Entity Data Model] を選択します。

  3. モデル名として「School.edmx」と入力し、[追加] をクリックします。

    Entity Data Model ウィザードの先頭ページが表示されます。

  4. [モデルのコンテンツの選択] ダイアログ ボックスで [データベースから生成] を選択し、[次へ] をクリックします。

    [データ接続の選択] ダイアログ ボックスが表示されます。

  5. [新しい接続] をクリックします。

    [接続のプロパティ] ダイアログ ボックスが表示されます。

  6. サーバー名を入力し、認証方式を選択します。データベース名として「School」と入力し、[OK] をクリックします。

    指定したデータベース接続の設定に従って [データ接続の選択] ダイアログ ボックスが更新されます。

  7. [エンティティ接続設定に名前を付けて Web.Config に保存:] チェック ボックスがオンになっていて、値が SchoolEntities に設定されていることを確認します。 [次へ] をクリックします。

    [データベース オブジェクトの選択] ダイアログ ボックスが表示されます。

  8. すべてのテーブルが選択され、[モデル名前空間] の値が SchoolModel であることを確認し、[完了] をクリックしてウィザードを終了します。

    このウィザードは、次の処理を行います。

    • System.Data.EntitySystem.Runtime.Serialization、および System.Security の各名前空間への参照を追加します。

    • 概念モデル、ストレージ モデル、およびこれらのモデルの間のマッピングを定義する School.edmx ファイルを生成します。

    • 概念モデルに基づいて生成されたクラスを含むソース コード ファイルを作成します。 ソース コード ファイルを確認するには、ソリューション エクスプローラーで Default.aspx ノードを展開します。

    • Web.Config ファイルの接続文字列セクションを更新します。

次の手順に進む前に、ADO.NET Entity Data Model デザイナー (既定のビューアー) で School.edmx ファイルを開いて内容を確認します。

Bb896242.note(ja-jp,VS.100).gif注 :
Visual Basic プロジェクトの場合は、一部のファイルがソリューション エクスプローラーに表示されないことがあります。すべてのプロジェクト ファイルを表示するには、Visual Studio タスク バーの [プロジェクト] をクリックし、[すべてのファイルの表示] をクリックします。

ユーザー インターフェイス (UI) の作成

このアプリケーションの UI には、HTML および ASP.NET Web コントロールが含まれます。

CourseManager Web ページを作成するには

  1. CourseManagerWeb プロジェクトで既定の Web ページ (Default.aspx) を右クリックし、[ビュー デザイナー] をクリックします。

    Web ページ デザイナーでファイルが開きます。

  2. 新しい ASP.NET Web アプリケーション内に自動生成された既定の div セクションを削除します。

  3. DropDownList コントロールをツールボックスからデザイン画面にドラッグし、次のプロパティを設定します。

    • IDdepartmentList に設定します。

    • AutoPostBackTrue に設定します。

  4. ツールボックスの [データ] セクションを展開し、EntityDataSource コントロールをパネルにドラッグします。 ID プロパティを departmentDS に変更します。

  5. GridView Web コントロールをパネルにドラッグし、ID プロパティを courseGridView に設定します。

UI が完成しました。

次に、DropDownList コントロールを EntityDataSource コントロールにバインドして、DropDownList に学科名が表示されるようにします。

  1. Ctrl キーを押しながら F5 キーを押してアプリケーションをビルドします。 これは、次の手順で使用するデータ ソース構成ウィザードでモデル メタデータを使用できるようにするために必要です。

  2. Web ページ デザイナー ウィンドウで departmentDS EntityDataSource コントロールを選択し、スマート タグをクリックして [データ ソースの構成] コマンドをクリックします。

    データ ソース構成ウィザードが起動します。

  3. [ObjectContext の構成] ダイアログ ボックスで、[名前付き接続] ボックスの一覧から [SchoolEntities] を選択します。

  4. [既定のコンテナー] ボックスの一覧から [SchoolEntities] を選択します。

  5. [次へ] をクリックします。

  6. [データの選択の構成] ダイアログ ボックスで、次の操作を行います。

    1. [EntitySetName] ボックスの一覧から [Departments] をクリックします。

    2. [EntityTypeFilter] ボックスの一覧から [(なし)] をクリックします。

    3. [選択] ボックスで [DepartmentID] フィールドおよび [名前] フィールドのチェック ボックスをオンにします。

    4. [完了] をクリックしてデータ ソースの構成を完了します。

  7. Web ページのデザイン ビューに戻ります。

  8. departmentList DropDownList コントロールを選択し、スマート タグをクリックして [データ ソースの選択] をクリックします。

    データ ソース構成ウィザードの [データ ソースの選択] ダイアログ ボックスが表示されます。

  9. [データ ソースの選択] ダイアログ ボックスで次の選択を行います。

    • [データ ソースの選択][departmentDS] を選択します。

    • [DropDownList に表示するデータ フィールドの選択][名前] を選択します。

    • [DropDownList の値のデータ フィールドの選択][DepartmentID] を選択します。

    Bb896242.note(ja-jp,VS.100).gif注 :
    ドロップダウン リストに使用できる値がない場合は、[スキーマの更新] をクリックします。

  10. [OK] をクリックします。

これでソリューションが正常にビルドされるようになりました。 アプリケーションを実行すると、DropDownList コントロールに学科名が設定されます。 学科を選択するとフォームがポストされますが、授業の時間割に関する情報はまだ表示されません。

GridView コントロールのバインド

次に、選択した学科で提供されるすべての講座を GridView コントロールに表示するためのコードを追加します。 コードを追加するには、School モデルのエンティティとアソシエーションを表す共通言語ランタイム (CLR) オブジェクトに対する厳密に型指定されたクエリを作成します。

GridView コントロールをバインドするには

  1. ソリューション エクスプローラーで、[Default.aspx.vb] または [Default.aspx.cs] を右クリックし、[コードの表示] をクリックします。

  2. 次の using (C#) ステートメントまたは Imports (Visual Basic) ステートメントを追加して、School データベースから作成されたモデルとエンティティの名前空間を参照します。

    Imports System.Data.Objects
    
    using System.Data.Objects;
    
  3. オブジェクト コンテキストを表すプロパティを _Default クラスに追加します。

    ' Create an ObjectContext based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. 既存の Page Load イベント ハンドラーに次のコードを追加して schoolContext プロパティを初期化します。

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    // Initialize the data context.
    schoolContext = new SchoolEntities();
    
  5. Default.aspx Web ページのデザイン ビューに戻ります。 departmentList DropDownList コントロールをダブルクリックします。

    これにより、departmentList コントロールの SelectedIndexChanged イベント ハンドラーが Default.aspx.vb ファイルまたは Default.aspx.cs ファイルに追加されます。

  6. SelectedIndexChanged イベント ハンドラーに次のコードを貼り付けます。

    'Get the department ID.
    Dim departmentID As Int32 = CType(departmentList.SelectedValue, Int32)
    
    ' Select course information based on department ID.
    Dim courseInfo = _
        From c In schoolContext.Courses _
        Where c.Department.DepartmentID = departmentID _
        Select New With _
        { _
            .CourseID = c.CourseID, _
            .CourseName = c.Title, _
            .CourseCredits = c.Credits _
        }
    
    ' Bind the GridView control to the courseInfo collection.
    courseGridView.DataSource = courseInfo
    courseGridView.DataBind()
    
    // Get the department ID.
    Int32 departmentID = Convert.ToInt32(departmentList.SelectedValue);
    
    // Select course information based on department ID.
    var courseInfo = from c in schoolContext.Courses
                     where c.Department.DepartmentID == departmentID
                     select new
                     {
                         CourseID = c.CourseID,
                         CourseTitle = c.Title,
                         CourseCredits = c.Credits
                     };
    
    // Bind the GridView control to the courseInfo collection.
    courseGridView.DataSource = courseInfo;
    courseGridView.DataBind();
    

    このコードは、LINQ to Entities クエリを使用して、指定された DepartmentID に基づいて講座情報を取得します。 このクエリは、講座 ID、講座名、および講座単位を含む匿名型のコレクションを生成します。 その後、このコレクションは GridView コントロールにバインドされます。

  7. Default.aspx.vb ファイルまたは Default.aspx.cs ファイルの _Default クラスに PreRenderComplete イベント ハンドラーを追加します。 次のコードを追加して、ページが最初に表示されたときに GridView コントロールが初期化されるようにします。

    Private Sub Page_PreRenderComplete(ByVal sender As Object, _
                                       ByVal e As System.EventArgs) _
                                       Handles Me.PreRenderComplete
        ' Force initial GridView update.
        departmentList_SelectedIndexChanged(Me, New EventArgs())
    End Sub
    
    protected void Page_PreRenderComplete(object sender, EventArgs e)
    {
        // Force initial GridView update.
        departmentList_SelectedIndexChanged(this.Page, new EventArgs());
    }
    

これでアプリケーションが正常にビルドされ、完全に機能するようになりました。 ドロップダウン リストで別の学科を選択すると、フォームがポストされ、対応する講座情報で GridView コントロールが更新されます。

コード リスト

このセクションでは、既定の Web ページの本文および CourseManagerWeb ソリューションの分離コード ファイルのコードの最終バージョンを示します。

既定の Web ページの本文

<body>
    <form id="form1" runat="server">
    <asp:DropDownList ID="departmentList" runat="server" 
                      AutoPostBack="True" DataSourceID="departmentDS" 
                      DataTextField="Name" DataValueField="DepartmentID" 
                      Height="19px" Width="161px">
    </asp:DropDownList>
    <asp:EntityDataSource ID="departmentDS" runat="server" 
        ConnectionString="name=SchoolEntities" 
        DefaultContainerName="SchoolEntities" 
        EnableFlattening="False" EntitySetName="Departments" 
        Select="it.[DepartmentID], it.[Name]">
    </asp:EntityDataSource>
    <asp:GridView ID="courseGridView" runat="server">
    </asp:GridView>
    </form>
</body>

分離コード ファイル

Imports System.Data.Objects
Partial Public Class _Default
    Inherits System.Web.UI.Page
    ' Create an ObjectContext based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Protected Sub Page_Load(ByVal sender As Object, _
                            ByVal e As System.EventArgs) _
                            Handles Me.Load
        ' Initialize the ObjectContext.
        schoolContext = New SchoolEntities()
    End Sub

    Protected Sub departmentList_SelectedIndexChanged( _
                            ByVal sender As Object, _
                            ByVal e As EventArgs) _
                            Handles departmentList.SelectedIndexChanged
        'Get the department ID.
        Dim departmentID As Int32 = CType(departmentList.SelectedValue, Int32)

        ' Select course information based on department ID.
        Dim courseInfo = _
            From c In schoolContext.Courses _
            Where c.Department.DepartmentID = departmentID _
            Select New With _
            { _
                .CourseID = c.CourseID, _
                .CourseName = c.Title, _
                .CourseCredits = c.Credits _
            }

        ' Bind the GridView control to the courseInfo collection.
        courseGridView.DataSource = courseInfo
        courseGridView.DataBind()
    End Sub
    Private Sub Page_PreRenderComplete(ByVal sender As Object, _
                                       ByVal e As System.EventArgs) _
                                       Handles Me.PreRenderComplete
        ' Force initial GridView update.
        departmentList_SelectedIndexChanged(Me, New EventArgs())
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Objects;
namespace CourseManagerWeb
{
    public partial class _Default : System.Web.UI.Page
    {
        // Create an ObjectContext based on SchoolEntity.
        private SchoolEntities schoolContext;

        protected void Page_PreRenderComplete(object sender, EventArgs e)
        {
            // Force initial GridView update.
            departmentList_SelectedIndexChanged(this.Page, new EventArgs());
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            // Initialize the data context.
            schoolContext = new SchoolEntities();
        }

        protected void departmentList_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Get the department ID.
            Int32 departmentID = Convert.ToInt32(departmentList.SelectedValue);

            // Select course information based on department ID.
            var courseInfo = from c in schoolContext.Courses
                             where c.Department.DepartmentID == departmentID
                             select new
                             {
                                 CourseID = c.CourseID,
                                 CourseTitle = c.Title,
                                 CourseCredits = c.Credits
                             };

            // Bind the GridView control to the courseInfo collection.
            courseGridView.DataSource = courseInfo;
            courseGridView.DataBind();
        }
    }
}

次の手順

CourseManagerWeb アプリケーションが正常に作成および実行されました。 Entity Framework の詳細については、「ADO.NET Entity Framework」を参照してください。

参照

その他のリソース

Quickstart
Samples (Entity Framework)
Querying an Entity Data Model