Entity Framework は、データ指向ソフトウェア アプリケーションの開発をサポートする ADO.NET の一連のテクノロジです。 データ指向アプリケーションのアーキテクトと開発者は、2 つの非常に異なる目標を達成する必要性に苦労してきました。 解決するビジネス上の問題のエンティティ、リレーションシップ、ロジックをモデル化する必要があります。また、データの格納と取得に使用されるデータ エンジンでも機能する必要があります。 データは複数のストレージ システムにまたがる場合があり、それぞれに独自のプロトコルがあります。単一のストレージ システムで動作するアプリケーションであっても、ストレージ システムの要件と、効率的で保守可能なアプリケーション コードを記述する要件とのバランスを取る必要があります。
Entity Framework を使用すると、開発者は、このデータが格納されている基になるデータベース テーブルと列に関心を持たずに、顧客や顧客の住所などのドメイン固有のオブジェクトやプロパティの形式でデータを操作できます。 Entity Framework を使用すると、開発者はデータを扱うときに、より高いレベルの抽象化で作業でき、従来のアプリケーションよりもコードが少ないデータ指向アプリケーションを作成および保守できます。 Entity Framework は .NET Framework のコンポーネントであるため、Entity Framework アプリケーションは、バージョン 3.5 SP1 以降の .NET Framework がインストールされている任意のコンピューターで実行できます。
モデルに命を与える
アプリケーションまたはサービスを構築する際の長年にわたる一般的な設計アプローチは、アプリケーションまたはサービスをドメイン モデル、論理モデル、物理モデルの 3 つの部分に分割することです。 ドメイン モデルは、モデル化されているシステム内のエンティティとリレーションシップを定義します。 リレーショナル データベースの論理モデルは、エンティティとリレーションシップを外部キー制約を持つテーブルに正規化します。 物理モデルは、パーティション分割やインデックス作成などのストレージの詳細を指定することで、特定のデータ エンジンの機能に対処します。
物理モデルはパフォーマンスを向上させるためにデータベース管理者によって改良されていますが、アプリケーション コードを記述するプログラマは、SQL クエリを記述してストアド プロシージャを呼び出すことで、主に論理モデルの操作に専念します。 ドメイン モデルは一般に、アプリケーションの要件をキャプチャして伝達するためのツールとして使用されます。多くの場合、プロジェクトの初期段階で表示および説明され、破棄される不活性な図として使用されます。 多くの開発チームは概念モデルの作成をスキップし、リレーショナル データベースでテーブル、列、キーを指定することから始めます。
Entity Framework では、エンティティ フレームワークに依存してこれらの操作をデータ ソース固有のコマンドに変換しながら、開発者がドメイン モデル (Entity Framework の 概念 モデルと呼ばれる) 内のエンティティとリレーションシップにクエリを実行できるようにすることで、モデルに命を与えます。 これにより、特定のデータ ソースに対するハードコーディングされた依存関係からアプリケーションが解放されます。
Code First を使用する場合、概念モデルはコード内のストレージ モデルにマップされます。 Entity Framework では、定義したオブジェクトの種類と追加の構成に基づいて概念モデルを推測できます。 マッピング メタデータは、ドメインの種類を定義した方法とコードで指定した追加の構成情報の組み合わせに基づいて、実行時に生成されます。 Entity Framework は、メタデータに基づいて必要に応じてデータベースを生成します。 詳細については、「 モデルの作成」を参照してください。
Entity Data Model Tools を使用する場合、概念モデル、ストレージ モデル、および 2 つの間のマッピングは、XML ベースのスキーマで表され、対応する名前拡張子を持つファイルで定義されます。
概念スキーマ定義言語 (CSDL) は、概念モデルを定義します。 CSDL は、Entity Framework の Entity Data Model の実装です。 ファイル拡張子は .csdl です。
ストア スキーマ定義言語 (SSDL) は、論理モデルとも呼ばれるストレージ モデルを定義します。 ファイル拡張子は .ssdl です。
マッピング仕様言語 (MSL) は、ストレージ モデルと概念モデル間のマッピングを定義します。 ファイル拡張子は .msl です。
ストレージ モデルとマッピングは、概念モデル、データ クラス、またはアプリケーション コードを変更しなくても、必要に応じて変更できます。 ストレージ モデルはプロバイダー固有であるため、さまざまなデータ ソース間で一貫した概念モデルを使用できます。
Entity Framework では、これらのモデルとマッピング ファイルを使用して、概念モデル内のエンティティとリレーションシップに対する操作をデータ ソース内の同等の操作に対して作成、読み取り、更新、および削除します。 Entity Framework では、概念モデルのエンティティをデータ ソースのストアド プロシージャにマッピングすることもできます。 詳細については、「 CSDL、SSDL、および MSL の仕様」を参照してください。
オブジェクトをデータにマップする
オブジェクト指向プログラミングは、データ ストレージ システムとやり取りするための課題となります。 クラスの編成は多くの場合、リレーショナル データベース テーブルの編成を反映していますが、適合は完璧ではありません。 複数の正規化されたテーブルは 1 つのクラスに頻繁に対応し、クラス間のリレーションシップはテーブル間のリレーションシップとは異なる方法で表されることが多いです。 たとえば、販売注文の顧客を表すために、 Order
クラスは、 Customer
クラスのインスタンスへの参照を含むプロパティを使用します。一方、データベース内の Order
テーブル行には、 Customer
テーブルの主キー値に対応する値を持つ外部キー列 (または列のセット) が含まれます。
Customer
クラスには、Orders
クラスのインスタンスのコレクションを含む Order
という名前のプロパティがある場合があります。一方、データベース内のCustomer
テーブルには同等の列はありません。 Entity Framework を使用すると、開発者は、この方法でリレーションシップを表現したり、データベースで表現されるリレーションシップをより厳密にモデル化したりできます。
既存のソリューションでは、オブジェクト指向のクラスとプロパティをリレーショナル テーブルと列にマッピングするだけで、このギャップを埋めようとしました。これは、"インピーダンスの不一致" と呼ばれる場合が多いです。 Entity Framework では、この従来のアプローチを採用する代わりに、論理モデルのリレーショナル テーブル、列、および外部キー制約を概念モデルのエンティティとリレーションシップにマップします。 これにより、オブジェクトの定義と論理モデルの最適化の両方において、柔軟性が向上します。 Entity Data Model ツールは、概念モデルに基づいて拡張可能なデータ クラスを生成します。 これらのクラスは、開発者が追加する追加のメンバーで拡張できる部分クラスです。 既定では、特定の概念モデルに対して生成されるクラスは、エンティティをオブジェクトとして具体化し、変更を追跡および保存するためのサービスを提供する基底クラスから派生します。 開発者は、これらのクラスを使用して、関連付けによって関連するオブジェクトとしてエンティティとリレーションシップを操作できます。 開発者は、概念モデル用に生成されるクラスをカスタマイズすることもできます。 詳細については、「 オブジェクトの操作」を参照してください。
エンティティ データへのアクセスと変更
Entity Framework は、単なるオブジェクト リレーショナル マッピング ソリューションだけでなく、基本的には、概念モデルのエンティティとリレーションシップとして表されるデータにアプリケーションがアクセスして変更できるようにすることです。 Entity Framework では、モデルおよびマッピング ファイル内の情報を使用して、概念モデルで表されるエンティティ型に対するオブジェクト クエリをデータ ソース固有のクエリに変換します。 クエリ結果は、Entity Framework が管理するオブジェクトに具体化されます。 Entity Framework には、概念モデルを照会してオブジェクトを返す次の方法が用意されています。
LINQ to Entities。 概念モデルで定義 Language-Integrated エンティティ型に対するクエリ (LINQ) のサポートを提供します。 詳細については、「 LINQ to Entities」を参照してください。
Entity SQL。 概念モデルのエンティティと直接連携し、Entity Data Model の概念をサポートする SQL のストレージに依存しない方言。 Entity SQL は、EntityClient プロバイダーを使用して実行されるオブジェクト クエリとクエリの両方で使用されます。 詳細については、「 Entity SQL の概要」を参照してください。
Entity Framework には EntityClient データ プロバイダーが含まれています。 このプロバイダーは、接続を管理し、エンティティ クエリをデータ ソース固有のクエリに変換し、Entity Framework がエンティティ データをオブジェクトに具体化するために使用するデータ リーダーを返します。 オブジェクトの具体化が必要ない場合、EntityClient プロバイダーは、アプリケーションで Entity SQL クエリを実行し、返された読み取り専用データ リーダーを使用できるようにすることで、標準の ADO.NET データ プロバイダーと同様に使用することもできます。 詳細については、「 Entity Framework 用の EntityClient プロバイダー」を参照してください。
次の図は、データにアクセスするための Entity Framework アーキテクチャを示しています。
Entity Data Model Tools では、概念モデルのエンティティ コンテナーを表す System.Data.Objects.ObjectContext
または System.Data.Entity.DbContext
から派生したクラスを生成できます。 このオブジェクト コンテキストは、変更を追跡し、ID、コンカレンシー、リレーションシップを管理するための機能を提供します。 このクラスは、挿入、更新、削除をデータ ソースに書き込む SaveChanges
メソッドも公開します。 クエリと同様に、これらの変更は、システムによって自動的に生成されるコマンドまたは開発者によって指定されたストアド プロシージャによって行われます。
データ プロバイダー
EntityClient
プロバイダーは、概念エンティティとリレーションシップの観点からデータにアクセスすることで、ADO.NET プロバイダー モデルを拡張します。 Entity SQL を使用するクエリを実行します。 Entity SQL は、 EntityClient
がデータベースと通信できるようにする基になるクエリ言語を提供します。 詳細については、「 Entity Framework 用の EntityClient プロバイダー」を参照してください。
Entity Framework には、正規のコマンド ツリーをサポートする更新された SqlClient データ プロバイダーが含まれています。 詳細については、 Entity Framework の SqlClient を参照してください。
エンティティ データ モデル ツール
Entity Framework ランタイムと共に、Visual Studio にはマッピングツールとモデリング ツールが含まれています。 詳細については、「 モデリングとマッピング」を参照してください。
詳細情報
Entity Framework の詳細については、以下を参照してください。
概要 - 簡単な Entity Framework アプリケーションを作成する方法を示す クイック スタートを使用して、すばやく起動して実行する方法について説明します。
Entity Framework の用語 - Entity Data Model と Entity Framework によって導入され、Entity Framework ドキュメントで使用される用語の多くを定義します。
Entity Framework リソース - 概念トピックへのリンクと、Entity Framework アプリケーションを構築するための外部トピックとリソースへのリンクを提供します。