オブジェクトの使用 (Entity Framework)

Entity Framework では、エンティティ型のインスタンスである型指定された共通言語ランタイム (CLR) オブジェクトとしてデータを表現し、そのデータに対してクエリ、挿入、更新、削除を実行できます。 エンティティ型とは、概念モデルで定義されたエンティティのことです。 概念モデルで定義されたエンティティとリレーションシップが、Entity Framework によってデータ ソースにマップされます。 Entity Framework は、データ ソースから返されるデータをオブジェクトとして具体化したり、オブジェクトに対する変更を追跡したりする機能のほか、同時実行性を処理したり、オブジェクトに対する変更をデータ ソース側に反映したり、オブジェクトをコントロールにバインドしたりする機能を備えています。 概念モデルに対するクエリは、LINQ to EntitiesEntity SQL 言語、または クエリ ビルダー メソッド (Entity Framework) を使用して実行できます。 詳細については、「概念モデルに対するクエリ (Entity Framework)」を参照してください。

ObjectContext クラスは、エンティティ オブジェクトと対話する際に使用される主要なクラスです。 ObjectContext クラスのインスタンスには、データベースへの接続、モデルを表すメタデータ、および、(作成、更新、および削除の各操作中にオブジェクトを追跡する) ObjectStateManager オブジェクトがカプセル化されています。 詳細については、「ID 解決、状態管理、および変更の追跡 (Entity Framework)」を参照してください。

Entity Framework には、概念モデルに基づいてオブジェクト レイヤーを自動生成するツールが用意されています。 オブジェクト レイヤーには、エンティティ型およびオブジェクト コンテキストの定義が含まれています。 オブジェクト コンテキストの定義には、ObjectContext の派生クラスが含まれています。通常、この派生クラスには、指定された型のエンティティのコレクションを返す一連のプロパティが含まれています。 オブジェクト レイヤー コードを生成するには、Entity Data Model Designer (エンティティ デザイナー) または EdmGen.exe コマンド ライン ツールを使用します。 詳細については、「Generated Code Overview」を参照してください。

エンティティ型

Entity Framework では、EntityObject から派生したエンティティ型、POCO ("plain-old" CLR object) 型、POCO プロキシ型、および自己追跡エンティティ型を扱うことができます。 次の各セクションでは、アプリケーションの特性を示すには、どのようなエンティティ型を選択するのが適切であるかを判断するうえで役立つ情報について説明します。

EntityObject

既定では、ADO.NET Entity Data Model ツールによって、EntityObject の派生エンティティ型が生成されます。 EntityObject の派生型を使用した場合、オブジェクト コンテキストが、最も効率的な方法でオブジェクト間の関係を管理し、発生した変更を追跡して、遅延読み込みをサポートします。 ただし、EntityObject の派生型は、Entity Framework に強く依存します。 永続化非依存性が要求されるアーキテクチャ (テスト駆動開発、ドメイン駆動開発など) を扱う場合、または、既存のドメイン クラスが存在する場合は、POCO または POCO プロキシの使用を検討してください。

POCO

Entity Framework では、データ クラスを一切変更することなく、既存のドメイン オブジェクトをデータ モデルと組み合わせて使用できます。 こうした POCO データ クラスは "永続化非依存オブジェクト" とも呼ばれ、Entity Data Model ツールによって生成されるエンティティ型とほとんど同じ動作 (クエリ、挿入、更新、および削除) をサポートします。

POCO 型を使用した場合、オブジェクト グラフに対する変更が発生しても、Entity Framework によって自動的に追跡されることはありません。 Entity Framework では、オブジェクトに対する変更は、スナップショット メカニズムを使用して検出されます。 オブジェクト コンテキストをオブジェクト グラフと同期させるには、DetectChanges を呼び出します。 既定では、データ ソースにデータを保存する前に、オブジェクト コンテキストがこのメソッドを呼び出します。 このメカニズムには、即時的な通知メカニズムと比べて多くのメモリが使用されます。そのため、アプリケーション側で頻繁に変更を検知する必要がある場合は、特に、パフォーマンスへの影響が生じる可能性があります。 詳細については、「POCO エンティティでの変更の追跡 (Entity Framework)」を参照してください。 即時的な通知をサポートする場合は、変更追跡プロキシ オブジェクトの作成を有効にしてください。

遅延読み込みを最大限に活用するには、遅延読み込みプロキシの作成を有効にする必要があります。 詳細については、以下の「POCO プロキシ」セクションを参照してください。

POCO プロキシ

POCO プロキシは、効率性の高い即時変更追跡と遅延読み込みが必要な場合に使用します。 プロキシを使用した場合、EntityObject の派生型と同じ機能を持たせながらも、ドメイン クラスを Entity Framework から切り離すことができます。 遅延読み込みプロキシや即時変更追跡プロキシの作成を有効にするには、対象の POCO クラスが、「POCO プロキシの作成要件 (Entity Framework)」のトピックに記載されている要件を満たしている必要があります。

プロキシは実行時に作成され、POCO 型から継承されます。 つまり、エンティティのランタイム型は、POCO 型とは異なるということです。 このため、シリアル化が複雑になるという問題が発生する場合があります。 詳細については、「POCO エンティティの使用 (Entity Framework)」を参照してください。 POCO 型に比べ、プロキシ型を作成することには、ある程度のオーバーヘッドが伴うことに注意してください。

自己追跡エンティティ

EntityObject の派生型、POCO 型、POCO プロキシ型はいずれも、変更追跡を処理するオブジェクト コンテキストにエンティティ オブジェクトを関連付けることのできるようなアプリケーションで効果的に使用できます。 ただし、オブジェクト コンテキストを利用できない階層にエンティティのグラフ全体を転送する必要がある場合は、変更をどのように追跡し、オブジェクト コンテキストに報告するかを検討する必要があります。 .NET Framework バージョン 4 以降では、スカラー プロパティ、複合プロパティ、およびナビゲーション プロパティに対する変更を自己追跡エンティティで記録できます。 自己追跡エンティティは、Entity Framework に依存しません。 自己追跡エンティティは、ADO.NET Self-Tracking Entity Generator テンプレートによって生成されます。 詳細については、「自己追跡エンティティの使用」を参照してください。

パフォーマンスに関する考慮事項

以下に示したのは、パフォーマンスに関する考慮事項です。アプリケーションに最適なオブジェクトの種類を検討する際は、こちらの情報も参考にしてください。

  • メタデータを読み込むときに、POCO またはプロキシ型を検出するためのコストは、属性化された EntityObject の派生型を検出するコストと比べて大きくなります。

  • 動的 POCO プロキシ型の生成には、ある程度のオーバーヘッドが伴います。

  • プロキシ型や EntityObject の派生型と比べると、POCO 型の初期化に伴うオーバーヘッドは最小限で済みます。

  • POCO スナップショット追跡は、即時的な通知の追跡よりもコストが大きくなります。

このセクションの内容

複合型オブジェクト (Entity Framework)

リレーションシップの定義と管理 (Entity Framework)

オブジェクトの作成、追加、変更、および削除 (Entity Framework)

オブジェクトのアタッチとデタッチ (Entity Framework)

ID 解決、状態管理、および変更の追跡 (Entity Framework)

接続とトランザクションの管理 (Entity Framework)

変更の保存と同時実行制御の管理 (Entity Framework)

コントロールへのオブジェクトのバインド (Entity Framework)

エンティティ キーの使用 (Entity Framework)

オブジェクトのシリアル化 (Entity Framework)

ObjectSet の使用 (Entity Framework)

オブジェクトのカスタマイズ (Entity Framework)

参照

概念

概念モデルに対するクエリ (Entity Framework)
クイック スタート (Entity Framework)