更新 : 2007 年 11 月
EntityDataSource コントロールを使用するときは、ContextCreating イベントで独自の ObjectContext インスタンスを指定できます。この場合、指定した ObjectContext インスタンスがコントロールで使用され、新しいインスタンスは作成されません。また、EntityDataSourceContextDisposingEventArgs イベントを使用して、ObjectContext が EntityDataSource コントロールによって破棄されるのを回避することもできます。これは、ページ内に ObjectContext のインスタンスを 1 つだけ保持して、複数のコントロールから使用する場合に便利です。
ObjectContext へのアクセス
EntityDataSourceContextCreatingEventArgs オブジェクトには Context プロパティがあり、ContextCreating イベント ハンドラで、このプロパティに既存の ObjectContext を代入できます。
ObjectContext を EntityDataSource コントロールの複数のインスタンスで使用する場合は、次の方法が一般的です。
ページの Load イベントで ObjectContext をインスタンス化し、それをクラスのメンバ変数に代入します。
EntityDataSourceContextCreatingEventArgs イベントを処理し、ObjectContext メンバを EntityDataSourceContextCreatingEventArgs オブジェクトの Context プロパティに代入します。
ContextDisposing イベントを処理し、EntityDataSourceContextDisposingEventArgs の Cancel() プロパティを true に設定します。これにより、ObjectContext が破棄されなくなります。
ページ内の各 EntityDataSource コントロールについて、手順 2. ~ 3. を繰り返します。
ObjectContext を破棄するには、Dispose メソッドを呼び出します。コンテキストはページのアンロード時にも破棄されます。
長時間実行される ObjectContext の管理の詳細については、「Object Services のリソースの管理 (Entity Framework)」を参照してください。
次のコードでは、Page オブジェクトに対する ObjectContext 変数を作成し、EntityDataSourceContextCreatingEventArgs オブジェクトの Context プロパティに代入しています。
public partial class _Default : System.Web.UI.Page
{
AdventureWorksModel.AdventureWorksEntities objCtx =
new AdventureWorksModel.AdventureWorksEntities();
protected void EntityDataSource2_ContextCreating(object sender,
EntityDataSourceContextCreatingEventArgs e)
{
e.Context = objCtx;
}
}
この objCtx メンバをその後も参照できるよう保持するには、次のコードに示すように、ContextCreated イベントをキャンセルします。
protected void EntityDataSource2_ContextDisposing(object sender,
EntityDataSourceContextDisposingEventArgs e)
{
e.Cancel = true;
}