Entity Framework ( EF ) は、 ADO.NET用のオープンソース[ 2 ]オブジェクトリレーショナルマッピング(ORM) フレームワークです。元々は.NET Frameworkの不可欠な部分として提供されていましたが、Entity Framework バージョン 6.0 以降は .NET Framework とは別に提供されるようになりました。
Entity Framework 6.4 は、従来のフレームワークの最新リリースでした。Entity Framework 6 はまだサポートされていますが、開発は終了しており、セキュリティ問題の修正のみが提供されます。[ 3 ]
Entity Framework Core (EF Core) と呼ばれる新しいフレームワークが、類似しているものの完全な機能の同等性はない状態で 2016 年に導入されました。[ 4 ]このフレームワークのバージョン番号は 1.0 から再開されました。
Entity Framework は、データ指向ソフトウェアアプリケーションの開発をサポートするADO.NETのテクノロジー群です。データ指向アプリケーションの設計者や開発者は、通常、2 つの非常に異なる目的を達成する必要性に苦労してきました。彼らは、解決しようとしているビジネス上の問題のエンティティ、関係、およびロジックをモデル化する必要があり、さらに、データの保存と取得に使用されるデータ エンジンも扱う必要があります。データは、それぞれ独自のプロトコルを持つ複数のストレージ システムにまたがる可能性があります。単一のストレージ システムで動作するアプリケーションであっても、ストレージ システムの要件と、効率的で保守しやすいアプリケーション コードを記述するという要件とのバランスを取る必要があります。この問題は一般に「オブジェクトとリレーショナルのインピーダンス ミスマッチ」と呼ばれます。[ 5 ]
オブジェクトリレーショナルマッピング(ORM) ツール (別名「オブジェクトリレーショナルマネージャ」) は数多く開発されており、開発者は、顧客や顧客の住所などのドメイン固有のオブジェクトやプロパティの形式でデータを操作できます。これにより、このデータが格納されている基盤となるデータベースのテーブルや列について心配する必要がなくなります。ORM を使用すると、開発者はデータを取り扱う際により高いレベルの抽象化で作業でき、従来のアプリケーションよりも少ないコードでデータ指向アプリケーションを作成および保守できます。Entity Framework は、現在 Microsoft 開発スタック内で使用が推奨されている ORM ソリューションです。[ 6 ]
Entity Framework の最初のバージョン (EFv1) は、2008 年 8 月 11 日にリリースされた .NET Framework 3.5 Service Pack 1 および Visual Studio 2008 Service Pack 1 に含まれていました。このバージョンは広く批判され、少なくとも 1000 人の開発者が署名した「不信任決議」まで出されました。[ 7 ]
Entity Framework の 2 番目のバージョンである Entity Framework 4.0 (EFv4) は、.NET 4.0 の一部として 2010 年 4 月 12 日にリリースされ、バージョン 1 に対する多くの批判に対処しました。[ 8 ]
Entity Frameworkの第3バージョンであるバージョン4.1は、Code Firstのサポートを追加して2011年4月12日にリリースされました。
バージョン4.1のアップデート版であるEntity Framework 4.1 Update 1が、2011年7月25日にリリースされました。このアップデートには、バグ修正と新たにサポートされる型が含まれています。
バージョン4.3.1は2012年2月29日にリリースされました。[ 9 ]移行のサポートなど、いくつかのアップデートがありました。
バージョン 5.0.0 は 2012 年 8 月 11 日にリリースされ[ 10 ]、.NET Framework 4.5 を対象としています。また、このバージョンは .NET Framework 4 でも利用可能ですが、バージョン 4 に比べてランタイムの利点はありません。
バージョン 6.0 は 2013 年 10 月 17 日にリリースされ[ 11 ] 、現在はApache License v2の下でライセンスされたオープンソース プロジェクトとなっています。ASP.NET MVCと同様に、ソース コードはGit を使用してGitHubでホストされています。[ 12 ]このバージョンには、コード ファーストサポートに関する多くの改善が含まれています。[ 13 ]
その後、Microsoft は .NET を Linux、OSX などにもクロスプラットフォーム対応にするため、近代化、コンポーネント化、展開することを決定しました。つまり、次のバージョンの Entity Framework は完全に書き直されることになります。[ 14 ] 2016 年 6 月 27 日、これは Entity Framework Core 1.0 として、ASP.NET Core 1.0 および .NET Core 1.0 と共にリリースされました。[ 15 ]当初は Entity Framework 7 という名前でしたが、段階的なアップグレードではなく完全な書き直しであることを強調し、EF6 を置き換えるものではないことを強調するために名前が変更されました。[ 16 ]
Entity Framework Core 1.0 はApache License v2 でライセンスされており、 GitHub上で完全にオープンに構築されました。Entity Framework Core 1.0 は、以前のバージョンの Entity Framework と概念的に類似している部分もありますが、Windows、Linux、OSX 上で動作し、新しい範囲のリレーショナルおよびNoSQLデータ ストアをサポートする、より効率的で強力、柔軟で拡張性の高い、まったく新しいコード ベースとして設計されました。[ 14 ]
Entity Framework Core 2.0 は、 Visual Studio 2017 15.3 および ASP.NET Core 2.0 [ 17 ]とともに、2017 年 8 月14 日( 2017-08-14 )にリリースされました。
Entity Framework Core 3.0 は、Visual Studio 2019 16.3 および ASP.NET Core 3.0 とともに2019 年 9 月23 日( 2019-09-23 )にリリースされました。 [ 18 ]
Entity Framework Core 3.1 (EF Core 3.1) は、 2019 年 12 月3 日( 2019-12-03 )に正式に本番環境での使用向けにリリースされ、少なくとも 2022 年 12 月 3 日までは推奨される長期サポート バージョンとなります。[ 19 ] [ 20 ]
Entity Framework Core 5.0 (EF Core 5) は、2020 年 11 月9 日( 2020-11-09 )に本番環境での使用向けにリリースされました。[ 19 ] [ 20 ] 1 年半後の 2022 年 5 月 10 日にサポートが終了し、廃止されました。[ 21 ]
Entity Framework Core 6.0 (EF Core 6) は2021 年 11 月10 日( 2021-11-10 )にリリースされ[ 22 ] [ 23 ]、少なくとも 2024 年 11 月 12 日までは推奨される長期サポート バージョンとなります。[ 24 ]
Entity Framework Core 7.0 (EF Core 7) は、 2022 年 11 月8 日( 2022-11-08 ) [ 25 ] [ 26 ]にリリースされ、JSON 列や一括更新などの機能が追加されました。
Entity Framework Core 8.0 (EF Core 8) は、2023 年 11 月14 日( 2023-11-14 ) [ 27 ] [ 28 ]にリリースされ、複合型を使用した値オブジェクトやプリミティブ コレクションなどの機能が追加されました。

ADO.NET Entity Framework のアーキテクチャは、下から順に以下の要素で構成されています。
エンティティデータモデル(EDM )は、エンティティ関係モデルの拡張版であるエンティティデータモデルと呼ばれるモデリング手法を使用して、データの概念モデル(CSDL)を指定します。[ 29 ] データモデルは主にエンティティと、それらが参加する関連付けを記述します。EDMスキーマは、XML(拡張マークアップ言語)の応用であるスキーマ定義言語(SDL)で表現されます。さらに、概念スキーマ(CSDL)の要素からストレージスキーマ(SSDL)へのマッピング(MSL)も指定する必要があります。マッピング仕様もXMLで表現されます。[ 30 ]

Visual Studio には、 EDM とマッピング仕様を視覚的に作成するためのエンティティ デザイナーも用意されています。このアプローチは、「コード ファースト」および「データベース ファースト」アプローチの代替として、「モデル ファースト」アプローチと呼ばれています。ツールの出力は、スキーマとマッピングを指定する XML ファイル (*.edmx) です。edmx ファイルには、EF メタデータ アーティファクト (CSDL/MSL/SSDL コンテンツ) が含まれています。これらの 3 つのファイル (csdl、msl、ssdl) は、手動で作成または編集することもできます。「モデル ファースト」アプローチは、EF Core バージョンではサポートされません。[ 31 ]
Visual Studio のエンティティ データ モデル ウィザード[ 32 ]は、ほとんどの場合、データベース スキーマと概念スキーマの間で 1 対 1 (1:1) のマッピングを最初に生成します。リレーショナル スキーマでは、要素はテーブルで構成され、主キーと外部キーによって関連するテーブルが結合されます。これに対し、エンティティ 型はデータの概念スキーマを定義します。
エンティティ型は、複数の型付きフィールドの集合体です。各フィールドはデータベース内の特定の列に対応し、複数の物理テーブルからの情報を含むことができます。エンティティ型は、物理スキーマ内の関係とは無関係に、互いに関連付けることができます。関連するエンティティも同様に公開されます。これは、エンティティが参加しアクセスする関係を示す名前のフィールドを介して行われ、データベース内の特定の列から値を取得する代わりに、関係をたどって、関連付けられているエンティティ(またはエンティティのコレクション)を返します。
エンティティ型は、エンティティが準拠するオブジェクトのクラスを構成し、エンティティはエンティティ型のインスタンスです。エンティティは、アプリケーションが解決しようとしている問題の一部を構成する個々のオブジェクトを表し、キーによってインデックス付けされます。たとえば、上記の物理スキーマを変換すると、2つのエンティティ型が得られます。
論理スキーマと物理スキーマとのマッピングは、XML ファイルとして指定されるエンティティ データ モデル(EDM) として表現されます。ADO.NET Entity Framework は、実際にマッピングを実行するために EDM を使用し、アプリケーションがエンティティを操作できるようにします。内部的には、 DataSetやRecordSetなどの ADO.NET 構造の使用を抽象化します。ADO.NET Entity Framework は、エンティティが複数のテーブルから情報を参照する場合、またはリレーションシップをたどる場合に必要となる結合を実行します。エンティティが更新されると、情報がどのテーブルから取得されたかを追跡し、一部のデータが更新されたテーブルを更新するために SQL 更新ステートメントを発行します。ADO.NET Entity Framework は、SQL の派生である eSQL を使用して、エンティティとそのリレーションシップに対するクエリ、集合論的演算、および更新を実行します。必要に応じて、eSQL のクエリは、基となるデータベースのネイティブ SQL 形式に変換されます。
エンティティ型とエンティティセットは論理的な EDM スキーマを構成するだけであり、どのような形式でも公開できます。ADO.NET Entity Framework には、これらのエンティティを要素と関係がプロパティとして公開されるオブジェクトとして提示するオブジェクト サービスが含まれています。したがって、エンティティ オブジェクトは EDM エンティティ型のインスタンスのフロントエンドにすぎず、オブジェクト指向言語がそれらにアクセスして使用できます。同様に、他のフロントエンドを作成することもできます。これは、Web サービス ( WCF データ サービスなど) や、エンティティをシリアル化して永続ストレージやネットワーク経由で転送する場合に使用される XML を介してエンティティを公開します。[ 33 ]
エンティティはEntityTypeのインスタンスです。エンティティは、情報が関連するオブジェクト (顧客、注文など) の個々のインスタンスを表します。エンティティの識別は、それがインスタンスであるエンティティ型によって定義されます。つまり、エンティティ型は、エンティティが属するクラスを定義し、エンティティが持つプロパティを定義します。プロパティは、エンティティに名前と型を与えることで、エンティティの何らかの側面を記述します。ADO.NET Entity Framework のエンティティ型のプロパティは完全に型付けされており、DBMS システムで使用される型システムと .NET Framework の共通型システムの両方と完全に互換性があります。プロパティはSimpleTypeまたはComplexTypeになり、複数値にすることもできます。すべてのEntityTypeは名前空間に属し、エンティティ型の各インスタンスを一意に識別するEntityKeyプロパティを持っています。異なるプロパティ型は、次のように区別されます。
すべてのエンティティインスタンスは、エンティティ用のプロジェクトごとのコンテナであるEntityContainerに格納されます。各プロジェクトには、複数の名前空間とエンティティタイプにまたがるエンティティを参照できる、1つ以上の名前付きEntityContainerがあります。1つのエンティティタイプの複数のインスタンスは、EntitySetと呼ばれるコレクションに格納できます。1つのエンティティタイプは、複数のEntitySetを持つことができます。
任意の2つのエンティティタイプは、関連付け関係または包含関係のいずれかによって関連付けることができます。たとえば、出荷が顧客に請求されるのは関連付け関係であり、注文に注文の詳細が含まれるのは包含関係です。包含関係は、エンティティ間の継承をモデル化するためにも使用できます。2つのエンティティタイプ間の関係は、関係タイプによって指定され、そのインスタンス(関係と呼ばれます)がエンティティインスタンスを関連付けます。今後のリリースでは、構成や識別などの他の種類の関係タイプが導入される可能性があります。
関係の種類は、その次数(アリティ)または関連付けられるエンティティタイプの数と多重度によって特徴付けられます。ただし、ADO.NET Entity Framework の初期リリースでは、関係はバイナリ(次数 2)の双方向関係に限定されています。多重度は、関連付けられるエンティティインスタンスの数を定義します。多重度に基づいて、関係は 1 対 1、1 対 多、または多対多のいずれかになります。エンティティ間の関係には名前が付けられ、その名前はロールと呼ばれます。ロールは、関係の目的を定義します。
関係タイプには、操作またはアクションを関連付けることもできます。これにより、関連エンティティに対してアクションが実行された場合に、エンティティに対して何らかのアクションを実行できます。関係は、関連エンティティに対して何らかの操作が実行されたときにアクションを実行するように指定できます。たとえば、関係の一部を構成するエンティティを削除する場合(OnDelete操作)、実行できるアクションは次のとおりです。[ 37 ]
関連関係は両端で異なる意味を持つ可能性があるため、両端ごとに異なるアクションを指定できます。
ADO.NET Entity Framework は、XML ベースのデータ定義言語であるスキーマ定義言語(SDL) を使用して EDM スキーマを定義します。SDL は、 String、Int32、Double、Decimal、Guid、DateTimeなど、CTS のプリミティブ型と同様の単純型を定義します。プリミティブ値と名前のマップを定義する列挙型も単純型とみなされます。列挙型はフレームワーク バージョン 5.0 以降でのみサポートされています。複合型は、他の型の集合から作成されます。これらの型のプロパティの集合がエンティティ型を定義します。この定義は、EBNF 文法で次のように記述できます。
EntityType :: = ENTITYTYPE entityTypeName [ BASE entityTypeName ] [ ABSTRACT true | false ] KEY propertyName [, propertyName ] * {( propertyName PropertyType [ PropertyFacet ] * ) + }PropertyType ::= ( ( PrimitiveType [ PrimitiveTypeFacets ] * ) | ( complexTypeName ) | RowTypePropertyFacet ::= ( [ NULLABLE true | false ] | [ DEFAULT defaultVal ] | [ MULTIPLICITY [ 1 | * ]] )プロパティタイプファセット::= MAXLENGTH | PRECISION | SCALE | UNICODE | FIXEDLENGTH | COLLATION | DATETIMEKIND | PRESERVESECONDSプリミティブ型::= BINARY | STRING | BOOLEAN | SINGLE | DOUBLE | DECIMAL | GUID | BYTE | SBYTE | INT16 | INT32 | INT64 | DATETIME | DATETIMEOFFSET | TIME )ファセットは、プロパティのメタデータ(null許容かデフォルト値があるかなど)や、プロパティのカーディナリティ(単一値か複数値かなど)を記述するために使用されます。多重度「1」は単一値プロパティを表し、「*」は複数値プロパティであることを意味します。例として、エンティティはSDLで次のように表すことができます。[ 38 ]
<ComplexType Name= "Addr" > <Property Name= "Street" Type= "String" Nullable= "false" /> <Property Name= "City" Type= "String" Nullable= "false" /> <Property Name= "Country" Type= "String" Nullable= "false" /> <Property Name= "PostalCode" Type= "Int32" /> </ComplexType> <EntityType Name= "Customer" > <Key> <PropertyRef Name= "Email" /> </Key> <Property Name= "Name" Type= "String" /> <Property Name= "Email" Type= "String" Nullable= "false" /> <Property Name= "Address" Type= "Addr" /> </EntityType>関係タイプは、エンドポイントとその多重度を指定することで定義されます。たとえば、顧客と注文間の1対多の関係は次のように定義できます。
<Association Name= "CustomerAndOrders" > <End Type= "Customer" Multiplicity= "1" /> <End Type= "Orders" Multiplicity= "*" > <OnDelete Action= "Cascade" /> </End> </Association>ADO.NET Entity Framework は、エンティティとその関係性に対して概念レベルで宣言的なクエリと更新を記述することを目的とした、構造化クエリ言語の派生版であるEntity SQLを使用します。EDM はテーブル間でデータをパーティショニングすることを抽象化するように設計されているため、SQL とは異なり、結合のための明示的な構造を持ちません。
概念モデルに対するクエリは、エンティティ SQL クエリを受け入れるEntityClientクラスによって容易になります。クエリ パイプラインは、エンティティ SQL クエリをコマンド ツリーに解析し、クエリを複数のテーブルに分割して、EntityClient プロバイダに渡します。ADO.NET データ プロバイダと同様に、EntityClient プロバイダもConnectionオブジェクトを使用して初期化されます。このオブジェクトには、通常のデータ ストアと認証情報に加えて、SDL スキーマとマッピング情報が必要です。EntityClient プロバイダは、エンティティ SQL コマンド ツリーをデータベースのネイティブ フレーバーの SQL クエリに変換します。クエリの実行により、エンティティ SQL ResultSet が返されます。これは、ADO.NET ResultSet とは異なり、表形式構造に限定されません。
エンティティSQLは、以下の機能に対する組み込みサポートを追加することでSQLを強化します。
正規関数は、すべての Entity Framework 準拠のデータ プロバイダーでサポートされています。これらは、エンティティ SQL クエリで使用できます。また、LINQ to Entities の拡張メソッドのほとんどは正規関数に変換されます。これらは特定のデータベースに依存しません。ADO.NET データ プロバイダーが関数を受け取ると、それを目的の SQL ステートメントに変換します。[ 39 ]
しかし、すべてのDBMSが同等の機能と標準的な組み込み関数セットを備えているわけではありません。計算精度にも違いがあります。そのため、すべての標準関数がすべてのデータベースでサポートされているわけではなく、すべての標準関数が同じ結果を返すわけでもありません。
LINQ to Entities プロバイダーを使用すると、Entity Framework の概念モデルを介してデータをクエリするために、言語統合クエリ(LINQ) を使用できます。開発者は、データベース固有のSQLステートメントを記述する代わりに、標準の LINQ 演算子 ( 、、、など) を使用してC#またはVisual Basicでクエリを記述できます。LINQ to Entities はこれらのクエリを Entity Framework コマンド ツリーに変換し、それが基となるデータベース プロバイダーのコマンドに変換されてデータ ソースに対して実行されます。クエリはデータベース操作に変換する必要があるため、すべての LINQ 演算子と式がサポートされているわけではありません。Entity Framework をサポートするデータベース固有のプロバイダーがいくつか利用可能です。[ 40 ] [ 41 ]WhereSelectGroupBy
Entity Framework v4では、ObjectContextクラスにExecuteStoreQuery()とExecuteStoreCommand()という新しいメソッドが追加されました。
Visual Studio には Visualizer と呼ばれる機能があります。Visual Studio で記述された LINQ クエリは、デバッグ セッション中に Visualizer を使用してネイティブ SQL として表示できます。すべての RDBMS を対象とした LINQ to Entities (オブジェクト クエリ) 用の Visualizer は、Visual Studio Marketplace で入手できます。[ 42 ]
Entity Framework のパフォーマンス問題をトラブルシューティングするために、EF および EF Core の両方のバージョンに対応した様々なプロファイラが市販されています。
Entity Framework Core のパフォーマンスを向上させるために、Entity Framework Core ツールと拡張機能が利用可能です。[ 43 ]
EF Core は、.NET CLI (dotnet ef) および Visual Studio パッケージ マネージャー コンソールを介して、マイグレーションとリバース エンジニアリングのための設計時コマンドを公開しており、既存のデータベースから DbContext とエンティティ 型をスキャフォールディングします。公式ツール以外にも、IDE 統合により、一般的なタスクのための GUI ワークフローが提供されます。Visual Studio の EF Core Power Tools は、データベース ファーストのリバース エンジニアリングとモデルの視覚化機能を追加し、Entity Developer は、コード生成とマッピング構成でデータベース ファーストとモデル ファーストのアプローチをサポートする EF Core 用のビジュアル デザイナーを提供します。同様の機能は他の IDE (たとえば、Rider の EF Core コマンド用 UI) でも利用可能であり、高度なシナリオでは、カスタマイズ可能なスキャフォールディング テンプレートを活用して、生成されるコードを制御できます。
Entity Framework のパフォーマンスを向上させるために、Entity Framework ツールと拡張機能が利用可能です。[ 44 ]