EF7 fills contained navigation properties even when not requested. For example, I have the below entities.
public class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public int DepartmentId { get; set; }
public Department Department { get; set; }
}
public class Department
{
public int DepartmentId { get; set; }
public string Name { get; set; }
public ICollection<Employee> Employees { get; set; }
}
My fetch query is as below.
ctx.Employees.Where(e => e.Gender == "Male").Include(e => e.Department)
I get Department
property of Employee
object filled – which is as expected as I have an Include
for Department
. I find that Department.Employees
is also filled but partially (only with male employees). I have not specified an Include
for Department.Employees
, but it is still getting populated. Is this behavior by design? Is there any way to avoid fetching Department.Employees
in this scenario?
I am using EF7 NuGet package with version 7.0.0-rc1-final.
That is the normal behavior of EF. When you execute your query, all the entities you load is going to be attached to your context. So, EF is not executing another query and loading Department.Employees
partially, those employees were loaded earlier when you execute your query. In summary, when you consult Department.Employees
navigation property, EF is going to fill that property with the employees that you load with your query filtering by Gender
.
As I pointed out in my comment above, Lazy Loading is not supported in EF7. If you want to avoid that Json.NET serializes that property, you can use the attribute JsonIgnore
over that property or you can create a custom class (DTO) to project your query and fill only the properties that you need. I also recommend take a look to Automapper if you decide to use this last solution.