2016-11-09 9 views
0

私は基本的なMVCコアWeb APIを構築しており、Entity Frameworkを使用して接続しようとしていますが、「Lazy Loading」と呼ばれるものが出てきて、Lazy LoadingがEntityFrameworkを回転させているのですか?レイジーロードの例?

レイジーローディングはいつ使用され、どのように役立ちますか? entityframeworktutorialサイトから

+1

可能な複製であります](http://stackoverflow.com/questions/31366236/lazy-loading-vs-eager-loading) –

答えて

3

私の意見では、遅延読み込みは、エンティティまたはエンティティのコレクションが自動的にデータベースから読み込まれるときのプロセスです。

実際には、並べ替えと検索のアルゴリズムはユーザー側で適用され、クエリはすべてのデータを取得します。デフォルトではLazy Loading機能はONになっていますが、手動で無効にすることもできますし、サーバー側でフィルタリングを行い、必要なレコードのみを取得するIQueryableを使用して賢明なクエリを作成することもできます。プラクティスでは、それは時間とリソースを大幅に節約するのに役立ちます、大量のトラフィックを防止し、サーバ

に過負荷をかけることにより、より良い答えは、イーガーロードVS [遅延ロードのこのウェブサイト - > https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

+0

ありがとう!それは私がそれがどのように動作するのか簡単な分解を探していただけです。これは私のための新しい領域ですので、私は正しいことを確実にしたいと思っています。 – ARLCode

1

レイジーローディングは、あなたが具体的にするために要求されるまで、関連データの読み込みを遅らせることを意味します。例えば、Studentクラスは複合プロパティとしてStudentAddressを含んでいます。したがって、コンテキストは最初にデータベースからすべてstudentsをロードし、次にStudentAddressプロパティにアクセスすると、特定のアドレスstudentをロードします。

using (var ctx = new SchoolDBEntities()) 
{ 
    //Loading students only 
    IList<Student> studList = ctx.Students.ToList<Student>(); 

    Student std = studList[0]; 

    //Loads Student address for particular Student only (seperate SQL query) 
    StudentAddress address = std.StudentAddress; 
} 

上記のコードは2つのSQLクエリになります。その後、次の行に際制御リーチ

SELECT 
[Extent1].[StudentID] AS [StudentID], 
[Extent1].[StudentName] AS [StudentName], 
[Extent1].[StandardId] AS [StandardId] 
FROM [dbo].[Student] AS [Extent1] 

StudentAddress address = std.StudentAddress; 

はEFがStudentAddressをロードするためにDBへの2番目のクエリを送信します:

exec sp_executesql N'SELECT 
[Extent1].[StudentID] AS [StudentID], 
[Extent1].[Address1] AS [Address1], 
[Extent1].[Address2] AS [Address2], 
[Extent1].[City] AS [City], 
[Extent1].[State] AS [State] 
FROM [dbo].[StudentAddress] AS [Extent1] 
WHERE [Extent1].[StudentID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1 

ルールまず、それはすべてのstudentsを取得しますレイジーローディングの場合:

  • context.Configuration.ProxyCreationEnabledがtrueである必要があります。
  • context.Configuration.LazyLoadingEnabledが真である必要があります。ナビゲーション
  • プロパティは、publicvirtualと定義する必要があります。コンテキストが仮想として定義されていない場合は、 遅延読み込みを行いません(この場合、StudentAddressvirtualである必要があります)。
関連する問題