There are two properties that control the ability to lazy load navigation properties:
- LazyLoadingEnabled: controls whether navigation properties marked as virtual will be lazy loaded, that is, loaded on demand when they are accessed;
- ProxyCreationEnabled: Entity Framework will create dynamic proxy classes for unsealed types with virtual properties, whenever it loads an instance from the database or it is asked to create an instance (Create method).
The problem is: for the most cases, we need both properties to be true. If they are not, navigation properties are only loaded if:
- Eagerly loaded through the Include extension method;
- Explicitly loaded through the Load method (collections only).
There are cases, however, when you wouldn’t want to have proxies:
- When exposing entities through WCF, because since it knows nothing about the dynamic generated proxy types;
- When using, for example, AutoMapper, to convert from one type to another, for the same reason.
The one reason why you would want a proxy without lazy loading is for self-tracking changes, that is, the proxy detects changes made to it instead of having the DbChangeTracker class (the DbContext.ChangeTracker property) doing it.