From entityframeworktutorial site:
Lazy loading means delaying the loading of related data, until you specifically request for it. For example, Student
class contains StudentAddress
as a complex property. So, the context first loads all the students
from the database, then it will load the address of a particular student
when we access StudentAddress
property as shown below.
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;
}
The code shown above will result in two SQL queries. First, it will fetch all students
:
SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]
Then when control reach to following line:
StudentAddress address = std.StudentAddress;
EF will send the second query to db to load 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
Rules for lazy loading:
context.Configuration.ProxyCreationEnabled
should be true.
context.Configuration.LazyLoadingEnabled
should be true. Navigation
- property should be defined as
public
, virtual
. Context will NOT do
lazy loading if the property is not defined as virtual(in this case the StudentAddress
should be virtual
).