エンティティ フレームワークの概要

Entity Framework は、データ指向のソフトウェア アプリケーション開発をサポートする ADO.NET のテクノロジ セットです。 データ指向のアプリケーションの設計者と開発者はこれまで、2 つの大きく異なる目的を達成するために苦労してきました。 解決すべきビジネス上の問題のエンティティ、リレーションシップ、およびロジックをモデル化する一方で、データの格納と取得に使用するデータ エンジンに取り組む必要もあるからです。 データは複数のストレージ システムにまたがる場合があり、それぞれに独自のプロトコルが存在します。単一のストレージ システムを使用するアプリケーションであっても、ストレージ システムの要件と効率的で保守しやすいアプリケーション コードの記述要件のバランスを取る必要があります。

Entity Framework を使用することで、開発者は、顧客や顧客の住所など、ドメイン固有のオブジェクトおよびプロパティの形式でデータを扱うことができます。そのデータが格納されている、基になるデータベース テーブルや列を意識する必要はありません。 Entity Framework を使用すると、開発者はデータを操作するときに高い抽象化レベルで作業ができ、従来のアプリケーションよりコードの少ないデータ指向アプリケーションの作成と保守が可能になります。 Entity Framework は .NET Framework のコンポーネントであるため、.NET Framework バージョン 3.5 SP1 以降がインストールされていれば、どのコンピューターでも Entity Framework アプリケーションを実行できます。

このトピックの以降のセクションでは、Entity Framework の詳細について説明します。

  • Giving Life to Models

  • Mapping Objects to Data

  • Accessing and Changing Entity Data

  • Data Providers

  • Entity Data Model Tools

  • Learning More

モデルの活用

アプリケーションやサービスを構築するとき、従来からの一般的な設計アプローチは、アプリケーションまたはサービスをドメイン モデル、論理モデル、および物理モデルの 3 つの部分に分割する方法です。 ドメイン モデルでは、モデル化の対象となるシステムに存在するエンティティとリレーションシップを定義します。 リレーショナル データベースの論理モデルでは、外部キー制約を用いながらエンティティおよびリレーションシップをテーブルとして正規化します。 物理モデルでは、パーティション分割やインデックス化などのストレージ情報を指定することで、特定のデータ エンジンの機能に対応します。

物理モデルは、パフォーマンスを向上させるためにデータベース管理者が調整しますが、アプリケーション コードを記述するプログラマは、主に SQL クエリを記述したりストアド プロシージャを呼び出したりすることによって論理モデルを扱うことに専念します。 ドメイン モデルは通常、アプリケーションの要件を収集して伝達するためのツールとして使用されます。プロジェクトの初期段階でのみ表示および検討され、その後ほとんど使用されないのが一般的です。 概念モデルの作成を省略し、実際にリレーショナル データベースのテーブル、列、およびキーを指定することから開始する開発チームも多く存在します。

Entity Framework では、開発者がドメイン モデル (Entity Framework では概念モデルとも呼ばれる) 内のエンティティとリレーションシップにクエリを実行し、Entity Framework がそれらの操作をデータ ソース固有のコマンドに変換するという形で、モデルが活用されます。 これにより、特定のデータ ソースへの依存関係をアプリケーションにハードコーディングしなくても済みます。 概念モデル、ストレージ モデル、およびこの 2 者間のマッピングは、XML ベースのスキーマで表され、名前の拡張子が同じファイルで定義されます。

  • 概念モデルは概念スキーマ定義言語 (CSDL) で定義されます。 CSDL は、Entity Data Model の Entity Framework の実装です。 ファイル拡張子は .csdl です。

  • ストア スキーマ定義言語ファイル (SSDL) はストレージ モデル (論理モデルとも呼ばれる) を定義します。 ファイル拡張子は .ssdl です。

  • マッピング仕様言語ファイル (MSL) はストレージ モデルと概念モデルの間のマッピングを定義します。 ファイル拡張子は .msl です。

ストレージ モデルとマッピングは、概念モデル、データ クラス、またはアプリケーション コードを変更することなく、必要に応じて変更できます。 ストレージ モデルはプロバイダー固有なので、データ ソースの違いを意識することなく一貫した概念モデルを扱うことができます。

Entity Framework は、これらのモデル ファイルとマッピング ファイルを使用して、概念モデルのエンティティとリレーションシップに対する作成、読み取り、更新、削除などの操作を、データ ソースの同等の操作に変換します。 Entity Framework は、概念モデルのエンティティをデータ ソースのストアド プロシージャにマップする操作もサポートしています。 詳細については、「CSDL、SSDL、および MSL 仕様」を参照してください。

データへのオブジェクトのマッピング

オブジェクト指向プログラミングには、データ ストレージ システムと対話するという難題があります。 クラスの編成はリレーショナル データベース テーブルの編成に似ている場合がありますが、完全に一致するわけではありません。 正規化された複数のテーブルと単一のクラスが対応する場合も多く、クラス間のリレーションシップとテーブル間のリレーションシップとで表現方法が異なる場合もあります。 たとえば、販売注文の顧客を表すために、Order クラスは Customer クラスのインスタンスへの参照が含まれているプロパティを使用する一方で、データベースの Order テーブル行には Customer テーブルの主キー値に対応する値がある外部キー列 (または列セット) が含まれている場合があります。 Customer クラスには Order クラスのインスタンスのコレクションが含まれている Orders という名前のプロパティがありますが、データベースの Customer テーブルに同等の列がない場合などです。 Entity Framework は、この方法でリレーションシップを表すか、データベースで表されるリレーションシップに似せるかの柔軟性を開発者に与えます。 詳細については、「リレーションシップの定義と管理 (Entity Framework)」を参照してください。

既存のソリューションでは、"インピーダンスのミスマッチ" とよく呼ばれるこの差異を、オブジェクト指向のクラスやプロパティをリレーショナル テーブルやリレーショナル列にマップするだけで埋めようとしてきました。 Entity Framework では、この従来の方法を使用せずに、論理モデルのリレーショナル テーブル、列、および外部キー制約を概念モデルのエンティティとリレーションシップにマップします。 これにより、さらに柔軟にオブジェクトを定義して論理モデルを最適化することが可能になります。 Entity Data Model ツールでは、概念モデルに基づく拡張可能なデータ クラスが生成されます。 このクラスは、開発者が追加するメンバーで拡張できる部分クラスです。 既定では、特定の概念モデルに対して生成されるクラスは、エンティティをオブジェクトとして具体化したり変更を追跡したり保存したりするサービスを提供する基本クラスから派生します。 開発者はこのようなクラスを使用して、エンティティとリレーションシップを、アソシエーションによって関連付けられたオブジェクトとして操作できます。 また、開発者は、概念モデルに生成されるクラスをカスタマイズすることもできます。 詳細については、「オブジェクトの使用 (Entity Framework)」および「How to: Customize Object-Layer Code Generation」を参照してください。

エンティティ データに対するアクセスと変更

Entity Framework は単なるオブジェクト リレーショナル マッピング ソリューションではなく、基本的には、概念モデルのエンティティとリレーションシップとして表されるデータにアプリケーションからアクセスして変更できるようにするためのものです。 Entity Framework はモデル ファイルとマッピング ファイルの情報を使用して、概念モデルで表されるエンティティ型に対するオブジェクト クエリをデータ ソース固有のクエリに変換します。 クエリ結果は、Entity Framework が管理するオブジェクトに具体化されます。 Entity Framework は、概念モデルにクエリを実行してオブジェクトを返す方法として以下の機能を提供しています。

  • LINQ to Entities . 概念モデルで定義されているエンティティ型に対してクエリを実行するための統合言語クエリ (LINQ) をサポートしています。 詳細については、「LINQ to Entities」を参照してください。

  • Entity SQL . ストレージに依存しない SQL 言語。概念モデルのエンティティを直接操作し、Entity Data Model の概念をサポートしています。 Entity SQL はオブジェクト クエリと、EntityClient プロバイダーを使用して実行されるクエリの両方で使用されます。 詳細については、「Entity SQL の概要」を参照してください。

  • クエリ ビルダー メソッド。 これらのメソッドを使用すると、LINQ スタイルのクエリ メソッドを使用して Entity SQL クエリを構成できます。 詳細については、「クエリ ビルダー メソッド (Entity Framework)」を参照してください。

Entity Framework には、EntityClient データ プロバイダーが含まれています。 このプロバイダーは接続を管理し、エンティティ クエリをデータ ソース固有のクエリに変換し、Entity Framework がエンティティ データをオブジェクトに具体化するために使用するデータ リーダーを返します。 オブジェクトの具体化が不要であれば、アプリケーションで Entity SQL クエリを実行して返された読み取り専用のデータ リーダーを使用できるようにすると、EntityClient プロバイダーを標準の ADO.NET データ プロバイダーと同様に使用することもできます。 詳細については、「Entity Framework 用の EntityClient プロバイダー」を参照してください。

次の図は、データにアクセスするための Entity Framework アーキテクチャを示しています。

Entity Framework のアーキテクチャの図

Entity Data Model ツールは、概念モデルのエンティティ コンテナーを表す ObjectContext から派生したクラスを生成できます。 このオブジェクト コンテキストは、変更の追跡や ID、同時実行、およびリレーションシップの管理などの機能を提供します。 また、このクラスは、データ ソースに挿入、更新、および削除を書き込む SaveChanges メソッドも公開します。 このような変更は、クエリと同様に、システムによって自動的に生成されるコマンドで行うことも、特定のストアド プロシージャを使用するように指定することもできます。 詳細については、「オブジェクトの作成、追加、変更、および削除 (Entity Framework)」を参照してください。

データ プロバイダー

EntityClient プロバイダーは、概念エンティティおよびリレーションシップに従ってデータにアクセスし、ADO.NET プロバイダー モデルを拡張します。 Entity SQL を使用するクエリを実行します。 Entity SQL は、EntityClient がデータベースと通信する基盤となるクエリ言語を提供します。 詳細については、「Entity Framework 用の EntityClient プロバイダー」を参照してください。

更新された Entity Framework の SqlClient Data Provider は、正規コマンド ツリーをサポートしています。 詳細については、「.NET Framework Data Provider for SQL Server (SqlClient) (Entity Framework 用)」を参照してください。

Entity Data Model ツール

.NET Framework バージョン 4 には、Entity Framework ランタイムと共に EDM ジェネレーター (EdmGen.exe) が含まれています。 このコマンド プロンプト ユーティリティはデータ ソースに接続し、エンティティとテーブルの一対一のマッピングに基づいてモデル ファイルとマッピング ファイルを生成します。 また、概念モデル ファイル (.csdl) を使用して、エンティティ型と ObjectContext を表すクラスを含むオブジェクト レイヤー ファイルを生成します。 詳細については、「EDM ジェネレーター (EdmGen.exe)」を参照してください。

Visual Studio 2010 には、Visual Studio アプリケーションでモデル ファイルとマッピング ファイルを生成して保守するための充実したツール サポートが含まれています。 Entity Data Model デザイナーでは、Table-Per-Type 継承、Table-Per-Hierarchy 継承、複数のテーブルにマップされる分割されたエンティティなどの高度なマッピング シナリオの作成がサポートされています。 詳細については、「ADO.NET Entity Data Model Designer」を参照してください。

詳細情報

Entity Framework の詳細については、次のトピックを参照してください。

  • Entity Framework の用語
    Entity Data Model と Entity Framework で使用されている用語や Entity Framework のドキュメントで使用されている用語を多数定義しています。
  • Entity Framework のリソース
    概念に関するトピックへのリンクや Entity Framework アプリケーションの構築に関する外部トピックおよびリソースへのリンクを示します。

参照

概念

ADO.NET Entity Framework