Entity Framework の概要

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

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

モデルを利用する

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

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

Entity Framework では、開発者がドメイン モデル (Entity Framework では "概念" モデルとも呼ばれる) 内のエンティティとリレーションシップにクエリを実行し、Entity Framework がそれらの操作をデータ ソース固有のコマンドに変換するという形で、モデルが利用されます。 これにより、特定のデータ ソースへの依存関係をアプリケーションにハードコーディングしなくても済みます。

Code First を使用すると、概念モデルはコードのストレージ モデルにマッピングされます。 Entity Framework では、オブジェクトの種類と定義する追加の構成に基づいて概念モデルを推論できます。 マッピング メタデータは、ドメインの種類を定義した方法とコードで指定する追加の構成情報の組み合わせに基づいて実行時に生成されます。 Entity Framework では、必要に応じて、メタデータに基づいてデータベースが生成されます。 詳しくは、「モデルの作成」をご覧ください。

Entity Data Model ツールでの作業時には、概念モデル、ストレージ モデル、およびこの 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 クラスには Orders クラスのインスタンスのコレクションが含まれている Order という名前のプロパティがありますが、データベースの Customer テーブルに同等の列がない場合などです。 Entity Framework では、開発者は、この方法でリレーションシップを表すか、データベースでの表し方にさらに近い形でリレーションシップをモデル化するかを、柔軟に選択できます。

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

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

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 の概要」をご覧ください。

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

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

Entity Framework Architectural Diagram

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

データ プロバイダー

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

Entity Framework には、正規コマンド ツリーをサポートする更新された SqlClient Data Provider が含まれます。 詳しくは、「Entity Framework 用 SqlClient」をご覧ください。

Entity Data Model ツール

Entity Framework ランタイムに加えて、Visual Studio にはマッピング ツールとモデリング ツールが含まれています。 詳しくは、「モデリングとマッピング」をご覧ください。

詳細情報

Entity Framework について詳しくは、以下をご覧ください。

はじめに」 - 簡単な Entity Framework アプリケーションの作成方法を示すクイックスタートを使用して、簡単に使い始める方法について説明します。

Entity Framework の用語」 -Entity Data Model と Entity Framework で使用されている用語や Entity Framework のドキュメントで使用されている多くの用語が定義されています。

Entity Framework のリソース」 - 概念に関するトピックへのリンクや Entity Framework アプリケーションの構築に関する外部トピックおよびリソースへのリンクを示します。

関連項目