2016-11-09 3 views
0

Я создаю базовый API-интерфейс MVC Core и пытаюсь подключиться с помощью Entity Framework, я наткнулся на что-то, называемое «Lazy Loading», и я, похоже, не могу оборачивать голову тем, что Lazy Loading является вращающейся EntityFramework?Lazy Loading Примеры?

Когда Lazy Используется загрузка и как она приносит пользу?

+1

Возможный дубликат [Ленивая Загрузка против жадная загрузка ] (http://stackoverflow.com/questions/31366236/lazy-loading-vs-eager-loading) –

ответ

3

На мой взгляд, Lazy loading - это процесс, когда сущность или коллекция объектов автоматически загружается из базы данных.

На самом деле алгоритмы сортировки и извлечения применяются на стороне пользователя, тогда как запрос получает все данные. По умолчанию функция Lazy Loading включена, но может быть отключена вручную или вы можете построить умные запросы, то есть с помощью IQueryable, который выполняет фильтрацию на стороне сервера и извлекает только те записи, которые требуются. В практике, это поможет вам сэкономить много времени и ресурсов, путем предотвращения тяжелого трафика и перегрузки сервер

Лучше ответ на этот website-> https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

+0

Спасибо! Это все, что я искал простой разбор, как это работает, для меня это новая территория, поэтому я просто хочу убедиться, что я делаю это правильно. – ARLCode

1

С entityframeworktutorial сайта:

отложенной загрузки означает, задерживая загрузку соответствующих данных, пока вы специально не просить за него. Например, класс Student содержит StudentAddress как сложное свойство. Таким образом, контекст сначала загружает все из students из базы данных, затем он загружает адрес определенного student, когда мы получаем доступ к StudentAddress, как показано ниже.

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; 
} 

Приведенный выше код приведет к двум SQL-запросам. Во-первых, он будет получать все students:

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

Затем, когда управление достигают к следующей строке:

StudentAddress address = std.StudentAddress; 

EF пошлет второй запрос к БД для загрузки StudentAddress:

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 

Правила для ленивой загрузки:

  • context.Configuration.ProxyCreationEnabled должно быть правдой.
  • context.Configuration.LazyLoadingEnabled должно быть правдой. Навигация
  • имущество должно быть определено как public, virtual. Контекст НЕ будет делать ленивая загрузка, если свойство не определено как виртуальное (в этом случае StudentAddress должен быть virtual).