EF4の遅延ロード
先日blogでEF4と書きましたが、次期バージョンの.NET Framework 4.0に搭載されるADO.NET Entity Frameworkということで、USではEF4が省略形になっています。今日はEF4に搭載される遅延ロード(Lazy Load)をご紹介したいと思います。
現行の.NET 3.5 SP1に搭載されているEF v1はLINQ to SQLと異なり遅延ロードには対応していませんでした。よって下記のようにLoad()、Include()を呼び出す必要があります。そのためコードが若干、煩雑になるというデメリットがありました。
■パターン1
pubsEntities db = new pubsEntities();
var authors = db.authors;
foreach (var author in authors)
{
Console .WriteLine(author.au_lname);
if (!author.titleauthors.IsLoaded) author.titleauthors.Load();
Console .WriteLine(author.titleauthors.Count());
}
■パターン2
var authors = db.authors.Include("titleauthors");
foreach (var author in authors)
{
Console .WriteLine(author.au_lname);
Console .WriteLine(author.titleauthors.Count());
}
EF4では下記のようにdb.ContextOptions.DeferredLoadingEnabled = true;と記述することで、遅延ロードに対応します。ただし、この処理ではauthorsテーブルのレコード一件毎にtitleauthorsをCountするためのSQL文が実行されます。ラウンドトリップが増加するためパフォーマンスに問題が生じてしまう可能性があります。このことは上述したパターン1でも同じことが言えます。このような繰り返し処理をともなうプログラムでは、titileauthorsも含めて一発で取得できるパターン2を利用するべきです。
■パターン3
db.ContextOptions.DeferredLoadingEnabled = true;
var authors = db.authors;
foreach (var author in authors)
{
Console .WriteLine(author.au_lname);
Console .WriteLine(author.titleauthors.Count());
}
Comments
Anonymous
May 25, 2009
PingBack from http://microsoft-sharepoint.simplynetdev.com/ef4%e3%81%ae%e9%81%85%e5%bb%b6%e3%83%ad%e3%83%bc%e3%83%89/Anonymous
June 16, 2009
前回 は EF4 で追加される予定の POCO を解説しました。 V1 ではエンティティをデータ層として利用すべきか、ドメイン層で利用すべきか、という白熱した??議論がありました。 EF4 では POCO