EF4の遅延ロード


先日blogEF4と書きましたが、次期バージョンの.NET Framework 4.0に搭載されるADO.NET Entity Frameworkということで、USではEF4が省略形になっています。今日はEF4に搭載される遅延ロード(Lazy Load)をご紹介したいと思います。


 


現行の.NET 3.5 SP1に搭載されているEF v1LINQ 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テーブルのレコード一件毎にtitleauthorsCountするための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 (2)

  1. 雲のごとく より:

    前回 は EF4 で追加される予定の POCO を解説しました。 V1 ではエンティティをデータ層として利用すべきか、ドメイン層で利用すべきか、という白熱した??議論がありました。 EF4 では POCO

Skip to main content