EntityDataSource クイック スタートの例
更新 : 2007 年 11 月
このトピックでは、ADO.NET の EntityDataSource コントロールを使用してデータ バインディング シナリオを実装する例を示します。サンプル アプリケーションは、SalesOrderHeader の ID キーで識別される SalesOrderHeader に関連付けられた、SalesOrderDetail 品目を表示します。このアプリケーションで使用されるデータ モデルは、SQL Server 2005 に付属の AdventureWorks サンプル データベースに基づいています。
次の画面は、使用中のツールを示しています。ページの左側のリスト ボックスには、SalesOrderHeader 品目の ID キーが含まれています。この画面は、SalesOrderHeader 番号の 43666 がクリックされたところです。関連付けられた SalesOrderDetail 品目は、右側の Gridview コントロールによって表示されます。
例を実装する方法
この例は、次の段階を通じて実装されます。
ASP.NET Web アプリケーションを作成します。
AdventureWorks データベースに基づく ADO.NET Entity Data Model を追加します。
SalesOrderHeader キーを表示するリスト ボックスを追加します。
関連付けられた SalesOrderDetail 品目を表示する GridView コントロールを追加します。
2 つの EntityDataSource コントロールを追加して構成し、リスト ボックスと GridView コントロールにデータを提供します。
リスト ボックスで選択されたインデックスの変更イベントに対するイベント ハンドラを追加します。
ASP.NET Web アプリケーションの作成
Visual Studio の [ファイル] メニューから ASP.NET アプリケーションを作成します。プロジェクトに GetOrders EDSC という名前を付けます。Default.aspx ページのマークアップが開き、空の HTML 構文の form と div が表示されます。
ページ タイトルをタイトル マークアップ タグで囲んで指定します。
ADO.NET Entity Data Model の追加
このアプリケーションで使用されるデータは、SQL Server 2005 に付属の AdventureWorks サンプルのテーブルに基づく Entity Data Model (EDM) の実装です。
次の 5 つのエンティティが宣言されます。
Address
Contact
Product
SalesOrderDetail
SalesOrderHeader
これらの型のインスタンスは、論理的に、概念スキーマから構築されたオブジェクト モデル内の同じ名前のエンティティ セットに含まれています。
3 つのアソシエーションとアソシエーション セットが宣言されます。以下のアソシエーションの名前は、すべて FK_ で始まります。これは、Adventure Works データのテーブル内の外部キー関係を反映しています。
FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID
FK_SalesOrderHeader_Address_ShipToAddressID
FK_SalesOrderHeader_Contact_ContactID
AdventureWorks Sales Model を作成するには、次の操作を行います。
ソリューション エクスプローラで [GetOrders EDSC] プロジェクトを右クリックします。
[追加] をポイントし、[新しい項目] の順にクリックします。
[ADO.NET Entity Data Model] を選択し、新しいデータ モデルに「AdvWksSales.edmx」という名前を付けます。
表示された Entity Data Model ウィザードで、[データベースから生成] を選択し、[次へ] をクリックします。
AdventureWorks データベースへの接続を作成し、[次へ] をクリックします。
[データベース オブジェクトの選択] ダイアログ ボックスが表示されたら、Address、Contact、Product、SalesOrderDetail、および SalesOrderHeading を選択します。[完了] をクリックします。
AdvWksSales.edmx デザイナが表示され、データ モデルのエンティティおよびアソシエーションが示されます。SalesOrderHeader エンティティと SalesOrderDetail エンティティの間の一対多のアソシエーションに注意してください。これらの 2 つのデータ型とその間のアソシエーションは、サンプル アプリケーションで使用されます。プロジェクトをビルドしてデータ モデルを作成します。
データを表示するコントロールの追加
SalesOrderHeader キーおよび関連付けられた SalesOrderDetail 品目を表示するには、2 つのデータ コントロールが必要です。
表示コントロールをページに追加するには、次の操作を行います。
Visual Studio で Default.aspx デザイン ビューを開き、div の境界線を下へドラッグして、ページにコントロールを追加する場所を確保します。
"Select SalesOrderHeaderID" というテキストを含むラベルを追加します。
ラベルの下にリスト ボックスを追加します。ID には、既定の ListBox1 を使用してかまいません。このページの下部のページ マークアップに応じて、リスト ボックスのサイズと位置を設定します。
GridView コントロールをページに追加し、このトピックの下部のページ マークアップに応じて位置を設定します。ID には、既定の GridView1 を使用してかまいません。
"SalesOrderHeader ID" というテキストを含むラベルを GridView コントロールの上に追加します。
別のラベルを GridView の上に追加します。このラベルは、CommandText のパラメータで使用されます。labelHeaderIDFromList のように、目的に合った ID を設定します。このラベルのテキストを空の文字列に設定します。
EntityDataSource コントロールの追加と構成
EntityDataSource コントロールを追加するには、次の操作を行います。
EntityDataSource コントロールをページに追加します。この EntityDataSource コントロールに「EntDataSrc_OrderID」という名前を付けます。このコントロールは ListBox1 にバインドされ、SalesOrderHeader キーを表示します。
別の EntityDataSource コントロールをページに追加します。この EntityDataSource コントロールに「EntDataSrc_OrderDetails」という名前を付けます。このコントロールは Gridview1 にバインドされ、ListBox1 で選択された SalesOrderHeader ID キーに関連付けられている SalesOrderDetail エンティティを表示します。
メモ : |
---|
AdvWksSalesModel の Entity Data Model (EDM) を追加してからプロジェクトをまだビルドしていない場合は、ここでビルドしてください。そうしないと、次の手順が説明どおりに動作しない場合があります。EDM プロジェクトをビルドすると、EDM メタデータの成果物が、WebConfig ファイル内の接続文字列によって指定された場所に配置されます。 |
ListBox1 の EntDataSrc_OrderID へのデータ バインディングを構成するには、次の操作を行います。
EntityDataSource コントロールの [>] 記号をクリックします。
[データ ソースの構成] をクリックします。
[ObjectContext の構成] ダイアログ ボックスが表示されたら、[名前付き接続] ボックスの一覧の [AdventureWorksEntities] をクリックします。これは、Web.config ファイルからの接続文字列を識別します。
[DefaultContainerName] ボックスの一覧の [AdventureWorksEntities] をクリックします。これは、デザイン スキーマのデータ モデルで使用される EntityContainer の名前です。[次へ] をクリックします。
[データの選択の構成] ダイアログ ボックスが表示されたら、[EntitySetName] ボックスの一覧の [SalesOrderHeader] をクリックします。この型は継承階層の一部ではないため、[EntityTypeFilter] は空白にすることができます。
[SELECT ステートメント] の [SalesOrderID] チェック ボックスをオンにします。[完了] をクリックします。
ListBox1 の [>] 記号をクリックし、[データ ソースの選択] をクリックします。
[データ ソースの選択] ダイアログ ボックスが表示されたら、[データ ソースの選択] ボックスの一覧の [EntDataSrc_OrderID] をクリックします。次の 2 つのドロップダウン リストで [SalesOrderID] を選択します。
[OK] をクリックします。
この段階でアプリケーションを実行すると参考になります。リスト ボックスには、データ ソース内の SalesOrderHeader エンティティの ID キーがすべて表示されます。この情報は、アプリケーションの残りの機能が実装された場合に役立ちます。実装が完了すると、ユーザーは 1 つのキーを選択して、SalesOrderHeader に関連付けられたすべての SalesOrderDetail エンティティをページの右側の Gridview1 に表示できるようになります。
GridView コントロールによる EntityDataSource の構成
関連付けられた注文を Gridview1 にバインドするには、次の操作を行います。
Default.aspx ページのデザイン サーフェイスで、EntDataSrc_OrderDetails という名前の EntityDataSource コントロールを選択します。
EntityDataSource コントロールの [>] 記号をクリックします。
[データ ソースの構成] をクリックします。
[ObjectContext の構成] ダイアログ ボックスが表示されたら、[名前付き接続] ボックスの一覧の [AdventureWorksEntities] をクリックします。
[DefaultContainerName] ボックスの一覧の [AdventureWorksEntities] をクリックします。
[次へ] をクリックします。
[データの選択の構成] ダイアログ ボックスが表示されたら、[EntitySetName] ボックスの一覧の [SalesOrderDetail] をクリックします。この型は継承階層の一部ではないため、[EntityTypeFilter] は空白にすることができます。
[SELECT ステートメント] で、[SalesOrderDetailID、[OrderQty]、[ProductID]、[UnitPrice]、および [ModifiedDate] の各チェック ボックスをオンにします。
[完了] をクリックします。
EntityDataSource コントロールを右クリックし、[プロパティ] をクリックします。
[プロパティ] の一覧で [Where] を選択し、テキスト ボックスの右側にある省略記号をクリックします。
[式エディタ] ダイアログ ボックスが表示されたら、[Where 式] テキスト領域に「it.[SalesOrderID] = @parSalesOrderID」というテキストを入力します。
[パラメータ] の一覧の下にある [パラメータの追加] ボタンをクリックします。新しいパラメータに parSalesOrderID という名前を付けます。このパラメータは、ユーザーが [SalesOrderHeader] ボックスの一覧で ID キーを選択したときに設定されるラベルのテキストから取得されます。これは、[パラメータ ソース] ボックスの一覧で指定されます。
[コントロール] を選択します。
[ControlID] ボックスの一覧の [labelHeaderIDFromList] をクリックします。
[OK] をクリックします。
リスト ボックスで選択したインデックス変更のイベント ハンドラ
この実装の最後の段階では、ユーザーによる SalesOrderHeader の ID キーの選択をクエリに接続します。クエリでは、選択された SalesOrderHeader に関連付けられているすべての SalesOrderDetail エンティティのプロパティを返します。
SalesOrderDetailID、OrderQty、ProductID、UnitPrice、および ModifiedDate の各プロパティを取得するクエリを構成しました。EntityDataSource コントロールは、Web ページの labelHeaderIDFromList コントロールからパラメータを取得して、その値をクエリの Where 句に渡すように構成されています。そのクエリは、プロパティが表示される SalesOrderDetail エンティティに関連付けられた SalesOrderHeader を識別します。ここでは、labelHeaderIDFromList コントロールのテキスト プロパティに、ユーザーが選択した SalesOrderHeader の ID キーを設定するコードを追加する必要があります。
ListBox1 の SelectedIndexChanged イベントのイベント ハンドラを作成するには、次の操作を実行します。
Web ページのデザイン サーフェイスで ListBox1 を選択します。
ListBox1 を右クリックし、[プロパティ] をクリックします。
[プロパティ] で、[イベント] オプションをクリックします。
SelectedIndexChanged イベントをダブルクリックします。これにより、ASP.NET 分離コード ページである Default.aspx.cs または Default.aspx.vb が開き、イベント ハンドラのコード ブロックが表示されます。
手順 6. の下のコード ブロックに示されているイベント ハンドラを作成します。ハンドラ内のコードにより、labelHeaderIDFromList の値が、ListBox1 でユーザーが選択した値に設定されます。これにより、GridView1 の DataSource プロパティに EntDataSrcOrder が割り当てられます。最後に、EntDataSrc_OrderDetails で DataBind メソッドが呼び出されます。これで、labelHeaderIDFromList の ID キーに基づいてデータのクエリを実行するようにコントロールが構成されました。
サーバーが選択をすぐに取り込むことができるように、ListBox1 の AutoPostBack プロパティを true に設定します。
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
labelHeaderIDFromList.Text = ListBox1.SelectedValue;
GridView1.DataSource = EntDataSrc_OrderDetails;
GridView1.DataBind();
}
SelectedIndexChanged イベントが発生すると、パラメータ化された Where 句を使用して定義済みのクエリが実行されます。GridView1 に表示されるプロパティは、ListBox1 で選択された SalesOrderHeader に関連付けられている SalesOrderDetail エンティティです。
すべてのコントロールのページ マークアップ
次のページ マークアップには、ビルド済みの SalesOrderHeader に関連付けられた SalesOrderDetail エンティティを表示する、アプリケーションで初期化されたコントロールおよびプロパティがすべて含まれています。Where 句には、SalesOrderDetail エンティティに関連付けられた SalesOrderHeader の外部キーを含むパラメータが含まれています。
<body>
<form id="form1" runat="server">
<div style="height: 450px">
<br />
<asp:ListBox ID="ListBox1" runat="server"
Height="275px"
Width="100px"
style="position:absolute; left:50px; top:80px"
DataSourceID="EntDataSrc_OrderID" DataTextField="SalesOrderID"
DataValueField="SalesOrderID" AutoPostBack="True"
onselectedindexchanged="ListBox1_SelectedIndexChanged" >
</asp:ListBox>
<asp:GridView ID="GridView1" runat="server"
style="position:absolute; left:200px; top:75px">
</asp:GridView>
<asp:Label ID="Label1" runat="server"
Text="Select SalesOrderHeaderID"></asp:Label>
<asp:Label ID="Label2" runat="server" Text="SalesOrderHeaderID:"></asp:Label>
<asp:Label ID="labelHeaderIDFromList" runat="server"></asp:Label>
</div>
<asp:EntityDataSource ID="EntDataSrc_OrderID" runat="server"
ConnectionString="name=AdventureWorksEntities"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderHeader">
</asp:EntityDataSource>
<asp:EntityDataSource ID="EntDataSrc_OrderDetails" runat="server"
ConnectionString="name=AdventureWorksEntities"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderDetail"
Select="it.[SalesOrderDetailID], it.[OrderQty],
it.[ProductID], it.[UnitPrice], it.[ModifiedDate]"
Where="it.[SalesOrderID] = @parSalesOrderID">
<WhereParameters>
<asp:ControlParameter Name="parSalesOrderID" ControlID="labelHeaderIDFromList" Type="Int32"/>
</WhereParameters>
</asp:EntityDataSource>
</form>
</body>
コマンド テキストによる実装
前のセクションのマークアップは、SalesOrderHeader に関連付けられた SalesOrderDetail エンティティを表示する、Where 句を使用する実装を示しています。同じ結果は、CommandText と Entity SQL クエリを使用する方法でも得ることができます。この場合、パラメータは左の相関関係を含むクエリで使用されます。左の相関関係により、SalesOrderHeader エンティティと SalesOrderDetail エンティティの両方のプロパティが検出されます。
<body>
<form id="form1" runat="server">
<div style="height: 430px; width: 805px">
Search Sales Orders <br />
Select Order ID:
<br />
<asp:Label ID="LabelHeaderID"
runat="server" Text="SalesOrderHeaderID:"
style="position:absolute; left:200px; top:40px"></asp:Label>
<asp:Label ID="LabelHeaderIDFromList" runat="server" Text=""
style="position:absolute; left:375px; top:40px"></asp:Label>
<br />
<asp:ListBox ID="ListBox1" runat="server"
DataSourceID="EntDatSrc_OrderID"
DataTextField="SalesOrderID"
DataValueField="SalesOrderID" Height="285px"
Width="100px" style="position:absolute;
left:50px; top:80px"
AutoPostBack="True"
onselectedindexchanged="ListBox1_SelectedIndexChanged">
</asp:ListBox>
<asp:GridView ID="GridView1" runat="server"
style="position:absolute; left:200px; top:80px"
AllowPaging="false">
</asp:GridView>
<br />
</div>
<asp:EntityDataSource ID="EntDatSrc_OrderID" runat="server"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderHeader"
Select="it.[SalesOrderID]"
ConnectionString="name=AdventureWorksEntities">
</asp:EntityDataSource>
<asp:EntityDataSource ID="EntDatSrcOrderDetails" runat="server"
DefaultContainerName="AdventureWorksEntities"
CommandText="SELECT soh.SalesOrderID, sod.SalesOrderDetailID,
sod.OrderQty, sod.ProductID, sod.UnitPrice, sod.ModifiedDate
FROM AdventureWorksEntities.SalesOrderHeader
AS soh, soh.SalesOrderDetail AS sod
WHERE soh.SalesOrderID = @parSalesOrderID"
ConnectionString="name=AdventureWorksEntities" >
<CommandParameters>
<asp:ControlParameter Name="parSalesOrderID"
ControlID="LabelHeaderIDFromList" Type="Int32"/>
</CommandParameters>
</asp:EntityDataSource>
</form>
</body>