Entity Framework の概要

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

エンティティ フレームワーク を使用することで、開発者は、顧客や顧客の住所など、ドメイン固有のオブジェクトおよびプロパティの形式でデータを扱うことができます。そのデータが格納されている、基になるデータベース テーブルや列を意識する必要はありません。これは、開発者がデータを扱うときの抽象化レベルを上げて、データ指向のアプリケーションを作成および保守するために必要なコード量を減らすことで実現します。エンティティ フレームワーク は .NET Framework のコンポーネントなので、エンティティ フレームワーク アプリケーションは .NET Framework 3.5 Service Pack 1 (SP1) がインストールされているコンピュータ上で実行できます。

概念モデルの活用

データ モデリングの従来の一般的なデザイン パターンは、データ モデルを概念モデル、論理モデル、および物理モデルの 3 つに分割することです。概念モデルでは、モデル化の対象となるシステム内に存在するエンティティおよびリレーションシップを定義します。リレーショナル データベースの論理モデルでは、外部キー制約を用いながらエンティティおよびリレーションシップをテーブルとして正規化します。物理モデルでは、パーティション分割やインデックス化などのストレージ情報を指定することで、特定のデータ エンジンの機能に対応します。

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

エンティティ フレームワーク では、開発者が概念モデル内のエンティティとリレーションシップに対してクエリを実行し、エンティティ フレームワーク がこのような操作をデータ ソース固有のコマンドに変換するという形で、概念モデルが活用されています。これにより、特定のデータ ソースへの依存関係をアプリケーションにハードコーディングしなくても済みます。概念モデル、ストレージ モデル、および 2 つのモデル間のマッピングは、エンティティ データ モデル (EDM) と呼ばれる外部仕様で表現されます。ストレージ モデルとマッピングは、概念モデル、データ クラス、またはアプリケーション コードを変更することなく必要に応じて変更できます。ストレージ モデルはプロバイダ固有なので、データ ソースの違いを意識することなく一貫した概念モデルを扱うことができます。

EDM は、対応するファイル名拡張子を持つ次の 3 つのモデル ファイルとマッピング ファイルで定義します。

  • 概念スキーマ定義言語ファイル (.csdl) : 概念モデルを定義します。

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

  • マッピング スキーマ言語ファイル (.msl) : ストレージ モデルと概念モデルの間のマッピングを定義します。

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

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

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

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

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

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

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

  • Entity SQL : 概念モデルのエンティティを直接操作し、継承やリレーションシップなどの EDM 機能をサポートする、ストレージの影響を受けない SQL の言語です。Entity SQL は、オブジェクト クエリと EntityClient プロバイダを使用して実行されるクエリの両方で使用されます。詳細については、「Entity SQL の概要」を参照してください。

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

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

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

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

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

Entity Data Model ツール

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

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

詳細情報

エンティティ フレームワーク の詳細については、次のトピックを参照してください。

  • クイック スタート (Entity Framework)
    エンティティ データ モデル ツールと Visual Studio 2008 を使用して、初めての エンティティ フレームワーク アプリケーションを簡単に作成する方法を示します。
  • アプリケーションのシナリオ (Entity Framework)
    クエリの記述、データ コントロールへのオブジェクトのバインド、ビジネス ロジックの実装などの特定のアプリケーション シナリオに応じたトピックへのタスクベースのリンクを示します。
  • Entity Framework の機能
    エンティティ フレームワーク を構成する機能の詳細について説明すると共に、これらの機能について説明したトピックへのリンクを示します。
  • Entity Framework の用語
    EDM と エンティティ フレームワーク で導入された用語や エンティティ フレームワーク のドキュメントで使用される用語を多数定義しています。
  • Entity Framework のリソース
    概念に関するトピックへのリンクや エンティティ フレームワーク アプリケーションの構築に関する外部トピックおよびリソースへのリンクを示します。

参照

その他のリソース

ADO.NET Entity Framework