(原典:Entity Framework 6:Alpha2 Now Available)
Entity Framework 6 アルファ2が利用可能に
Entity Frameworkチームは先日2回目のEF6アルファリリースを発表しました。このアルファ2パッケージはNuGetからダウンロードできます。これはプレリリースパッケージになるので、NuGetパッケージマネージャでは『Include Prereleases』を選択して頂くか、パッケージマネージャコンソールから以下を実行してインストールしてください。
PM> Install-Package EntityFramework -Pre
今週のアルファリリースでは、以下のエリアに素晴らしい機能が追加されています。
- .NET 4.5上で実行時の検索および更新で非同期言語サポートが利用可能です。
- 独自コンベンションで、コードファーストがデータベースに対してマッピングタイプやプロパティに使用するデフォルトのコンベンションをオーバーライドできます。
- マルチテナントマイグレーションにより、各コンテキストのバックにある、独立して展開するモデルに対して、完全なコードファーストマイグレーションをサポートし、同じデータベースを複数のコンテキストで使用できます。
- LINQクエリのUsing Enumerable.Containsは、EFによりさらに効率的に処理されるようになり、SQL Serverプロバイダーのパフォーマンスが大幅に向上しました。
- EF6(非同期以外)のすべての機能は、.NET 4および.NET 4.5で利用可能で、前回.NET 4.5でしか利用できなかったEnumやSpatial型のサポートやパフォーマンスの向上も含まれています。
- 多くの大きなモデルのスタートアップ時間が、ビュー生成のパフォーマンスが改善されたことにより、劇的に向上しました。
以下は、上記機能の詳細になります。
非同期サポート
.NET 4.5では、タスクベースの非同期パターンが導入され、asyncおよびawaitキーワードを使って、非同期コードを簡単に書けるようになりました。EF6でもこのパターンをサポートしています。これは、ASP.NETアプリケーションにとって素晴らしい事で、これにより、EFを通じて行われるデータベースコールが非同期に処理されるようになり、ワーカースレッドがブロックされなくなります。データベースからのレスポンスを待っている間により多くのリクエストを処理できるようになるため、サーバー上のスケーラビリティが向上します。
以下のコードはロケーションエンティティの一覧に対してデータベースを検索しているMVCコントローラを表しています。
public class HomeController : Controller { LocationContext db = new LocationContext(); public async Task<ActionResult> Index() { var locations = await db.Locations.ToListAsync(); return View(locations); } }
上記のawaitキーワードがついた新しいToListAsyncメソッドを見てください。
Webサーバーがこのコードに到達した時に、データベースへのリクエストを開始するのですが、結果が返ってくるまでブロックするのではなく、リクエストを処理しているスレッドはスレッドプールへ結果を返し、ASP.NETが同じスレッドで他のリクエストを処理できるようにしています。つまり、スレッドは実際に処理が必要な時だけ消費され、Webサーバーが同じリソースでもっと並行リクエストを処理できるようにしています。
EFの非同期をカバーした、より詳細なウォークスルーが、追加情報とサンプルとともに利用可能です。また、ASP.NET MVCアプリケーションでの非同期の使用方法を示したウォークスルーも利用可能です。
独自コンベンション
EFコードファーストでは、通常はEFのデフォルトのコンベンションを使用して.NETクラスをテーブルにマップします。
例えば、コードファーストは『ID』で終わるプロパティを探して、プライマリーキーを自動的に構成します。
しかし、時にはこれらのコンベンションが利用できなかったりして、できれば独自のものを使用したい場合があります。
例えば、プライマリーキープロパティがすべて『Id』ではなく『Key』が使用されているケースなど。
独自のコンベンションでは、デフォルトのコンベンションをオーバーライドしたり、新しいコンベンションを追加できるため、コードファーストはプロジェクトに見合ったルールを使用したコンベンションでマップが可能になります。
以下のコードは、独自のコンベンションを使用して小数の精度をすべて5に設定するものです。他のコードファーストの構成では、このコードは継承DbContextクラス上にオーバーライドされたOnModelCreatingメソッドに配置します。
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Properties<decimal>() .Configure(x => x.HasPrecision(5)); }
しかし、もし小数プロパティによっては異なる精度が必要な場合はどうすればいいのでしょうか?
既存のコードファーストコンベンションと同じく、Fluent APIまたはData Annotationを使用してプロパティを明示的に構成すれば、この新しいコンベンションも特定のプロパティに対してオーバーライドできます。独自のコードファーストコンベンションについての詳細は、ここで確認できます。
コミュニティ活動
以前、オープンソースライセンスのもと、EFがリリースされたことをブログ投稿しました。それから数多くのコミュニティメンバーが寄与してくれ、それらがEF6アルファ2に含まれています。
コミュニティからの貢献には以下のものがあります。
- AlirezaHaghshenasは、ビュー生成のパフォーマンスを改善することにより、大きいEFモデルのスタートアップパフォーマンスを向上させた変更に貢献してくれました。
- UnaiZorrillaは、EFへのファーストコミュニティ機能に貢献してくれました。この機能は、以下のように、1つのメソッドコールで、すべてのコードファースト構成クラスをロードするものです。
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations .AddFromAssembly(typeof(LocationContext).Assembly); }
このコードは、LocationContextが定義されているアセンブリのEntityTypeConfiguration<T>またはComplexTypeConfiguration<T>から継承されたすべてのクラスを見つけてロードします。これは、コンテキストとコードファースト構成クラスの連結の量を減少させます。また大きなモデルに対して非常に便利なショートカットにもなります。
その他のEF6の新機能
EF6の開発について多くの情報がEF CodePlexサイト上にあります。その中に、今後EF6で計画されているその他の新機能を表示したロードマップがあります。
今後の機能で便利なものに、接続の弾力性があり、これにより、クラウド環境やWindows Azure SQL Databaseのようなデータベースでよくある一時的に未接続になった時のデータベース再接続を自動的に行います。
他にリクエストの多い機能で今後EF6に含まれるものとして、コードファーストを使用した時の検索や更新のストアドプロシージャをマップする機能があります。
まとめ
EF6は、CodePlexで開発された初めてのEntity Frameworkオープンソースリリースです。
EF6のアルファ2プレビューリリースには、試して頂きたい素晴らしい機能が含まれています。NuGet上で現在利用可能です。
EFチームは開発者からのフィードバックを期待しており、特に独自のコードファーストコンベンションや非同期サポートなどの新機能について、フィードバックを待っています。フィードバックの方法は、CodePlexサイト上のEF6アルファ2公表投稿、ディスカッションを開始、バグを登録でコメントを投稿してください。
Hope this helps,
Scott
P.S. ブログに加え、現在Twitterを使って簡単な更新やリンク共有を行っています。twitter.com/scottguで、私をフォローしてください。