Entity Framework 6 へのアップグレード
以前のバージョンの EF では、コードが、.NET Framework の一部として提供されるコア ライブラリ (主に System.Data.Entity.dll) と、NuGet パッケージで提供されるアウトオブバンド (OOB) ライブラリ (主に EntityFramework.dll) との間で分割されていました。 EF6 はコア ライブラリからコードを取得し、OOB ライブラリに組み込みます。 これは、EF をオープン ソースにするためにも、.NET Framework とは異なるペースで進化できるようにするためにも、必要なことでした。 その結果、移動された型に対してアプリケーションを再ビルドしなければならなくなりました。
これは、EF 4.1 以降で提供される DbContext を使用するアプリケーションでは簡単です。 ObjectContext を使用するアプリケーションではもう少し作業が必要ですが、さほど難しくはありません。
以下に、既存のアプリケーションを EF6 にアップグレードするために行う必要があることのチェックリストを示します。
1. EF6 NuGet パッケージをインストールする
新しい Entity Framework 6 ランタイムにアップグレードする必要があります。
- プロジェクトを右クリックし、[NuGet パッケージの管理] を選択します。
- [オンライン] タブで [EntityFramework] を選択し、[インストール] をクリックします
Note
以前のバージョンの EntityFramework NuGet パッケージがインストールされていた場合は、EF6 にアップグレードされます。
または、パッケージ マネージャー コンソールで、次のコマンドを実行することもできます。
Install-Package EntityFramework
2. System.Data.Entity.dll へのアセンブリ参照が削除されたことを確認する
EF6 NuGet パッケージをインストールすると、System.Data.Entity へのすべての参照がプロジェクトから自動的に削除されます。
3. EF 6.x コード生成を使用するために、すべての EF デザイナー (EDMX) モデルを置き換える
EF デザイナーを使用して作成されたモデルがある場合は、EF6 互換コードを生成するために、コード生成テンプレートを更新する必要があります。
Note
現時点では、Visual Studio 2012 および 2013 で利用可能なのは、EF 6.x DbContext ジェネレーター テンプレートだけです。
既存のコード生成テンプレートを削除します。 これらのファイルは、通常、<edmx_file_name>.tt および <edmx_file_name>.Context.tt という名前になり、ソリューション エクスプローラーで edmx ファイルに入れ子になります。 テンプレートを削除するには、ソリューション エクスプローラーでテンプレートを選択し、Del キーを押します。
Note
Web サイト プロジェクトでは、テンプレートは edmx ファイルに入れ子になりませんが、ソリューション エクスプローラーではその横に一覧表示されます。
Note
VB.NET プロジェクトでは、入れ子になったテンプレート ファイルを表示するには、[すべてのファイルを表示] を有効にする必要があります。
適切な EF 6.x コード生成テンプレートを追加します。 EF デザイナーでモデルを開き、デザイン サーフェイスを右クリックして、[コード生成項目の追加] を選択します
DbContext API (推奨) を使用している場合は、[データ] タブで EF 6.x DbContext ジェネレーターを使用できます。
Note
Visual Studio 2012 を使用している場合、このテンプレートを入手するには、EF 6 ツールをインストールする必要があります。 詳細については、「Entity Framework を取得する」を参照してください。
ObjectContext API を使用している場合は、[オンライン] タブを選択し、EF 6.x EntityObject ジェネレーターを探す必要があります。
コード生成テンプレートにカスタマイズを適用した場合は、更新されたテンプレートに再適用する必要があります。
4. 使用されているすべてのコア EF 型の名前空間を更新する
DbContext と Code First の型の名前空間は、変更されていません。 つまり、EF 4.1 以降を使用する多くのアプリケーションでは、何も変更する必要はありません。
以前は System.Data.Entity.dll 内にあった ObjectContext のような型は、新しい名前空間に移動されました。 つまり、EF6 に対してビルドするには、using ディレクティブまたは Import ディレクティブを更新しなければならない場合があります。
名前空間の変更に関する一般的な規則は、System.Data.* のすべての型が System.Data.Entity.Core.* に移動することです。 つまり、単に System.Data. の後に Entity.Core. を挿入します。 次に例を示します。
- System.Data.EntityException => System.Data.Entity.Core.EntityException
- System.Data.Objects.ObjectContext => System.Data.Entity.Core.Objects.ObjectContext
- System.Data.Objects.DataClasses.RelationshipManager => System.Data.Entity.Core.Objects.DataClasses.RelationshipManager
これらの型は、ほとんどの DbContext ベースのアプリケーションでは直接使用されないため、Core 名前空間にあります。 System.Data.Entity.dll の一部だったいくつかの型は、DbContext ベースのアプリケーションでまだ一般的に直接使用されているため、Core 名前空間に移動されていません。 以下にそれらを示します。
- System.Data.EntityState => System.Data.Entity.EntityState
- System.Data.Objects.DataClasses.EdmFunctionAttribute => System.Data.Entity.DbFunctionAttribute
Note
このクラスは名前が変更されました。古い名前のクラスはまだ存在し、機能しますが、現在は非推奨としてマークされています。
- System.Data.Objects.EntityFunctions => System.Data.Entity.DbFunctions
Note
このクラスは名前が変更されました。古い名前のクラスはまだ存在し、機能しますが、現在は非推奨としてマークされています。
- 空間クラス (たとえば、DbGeography、DbGeometry) は、System.Data.Spatial => System.Data.Entity.Spatial に移動されました
Note
System.Data 名前空間の一部の型は、EF アセンブリではない System.Data.dll に含まれています。 これらの型は移動されていないため、名前空間は元のままです。
.NET