次の方法で共有


オブジェクト コンテキストの有効期間の管理 (EntityDataSource)

更新 : 2007 年 11 月

EntityDataSource コントロールを使用するときは、ContextCreating イベントで独自の ObjectContext インスタンスを指定できます。この場合、指定した ObjectContext インスタンスがコントロールで使用され、新しいインスタンスは作成されません。また、EntityDataSourceContextDisposingEventArgs イベントを使用して、ObjectContextEntityDataSource コントロールによって破棄されるのを回避することもできます。これは、ページ内に ObjectContext のインスタンスを 1 つだけ保持して、複数のコントロールから使用する場合に便利です。

ObjectContext へのアクセス

EntityDataSourceContextCreatingEventArgs オブジェクトには Context プロパティがあり、ContextCreating イベント ハンドラで、このプロパティに既存の ObjectContext を代入できます。

ObjectContextEntityDataSource コントロールの複数のインスタンスで使用する場合は、次の方法が一般的です。

  1. ページの Load イベントで ObjectContext をインスタンス化し、それをクラスのメンバ変数に代入します。

  2. EntityDataSourceContextCreatingEventArgs イベントを処理し、ObjectContext メンバを EntityDataSourceContextCreatingEventArgs オブジェクトの Context プロパティに代入します。

  3. ContextDisposing イベントを処理し、EntityDataSourceContextDisposingEventArgs の Cancel() プロパティを true に設定します。これにより、ObjectContext が破棄されなくなります。

  4. ページ内の各 EntityDataSource コントロールについて、手順 2. ~ 3. を繰り返します。

  5. 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;
        }

参照

概念

EntityDataSource のイベント

EntityDataSource クイック スタートの例

その他の技術情報

EntityDataSource を使用したデータ選択