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