Question

I've tried to get the Studies property of the Department object to lazy load, but it will only load when I eagerly load it. I've added a DepartmentId to the Study class with no results, used ICollection, ISet and virtual. Public and private setters seems to make no difference (and it shouldn't). Nothing seems to work. Using EF 6.1.

public class Department
{
  private Department() {}

  public Department(DepartmentTitle title)
  {
    if (title == null) throw new ArgumentNullException();

    this.Title = title;
    this.Studies = new HashSet<Study>();
  }

  public int DepartmentId { get; private set; }

  public virtual DepartmentTitle Title { get; private set; }
  public virtual ICollection<Study> Studies { get; set; }
}

public class Study
{
  private Study() {}

  public Study(StudyTitle title, Department department)
  {
    if (title == null) throw new ArgumentNullException();
    if (department == null) throw new ArgumentNullException();

    this.Title = title;
    this.Department = department;
  }

  public int StudyId { get; private set; }

  public virtual StudyTitle Title { get; private set; }
  public virtual Department Department { get; set; }
}

// Here I save the department and study objects
// I verified they exist in the database    
var department = new Department(new DepartmentTitle("Department Title Here"));
department.Studies.Add(new Study(new StudyTitle("Study Title Here"), department));
data.SaveChanges();

// In a new database context
// Here I try to lazy load the Studies property, but get null
// It works if I add Include("Studies") before Where()
Department department = data.Departments.Where(d => d.Title.Value == "Department Title Here").Single();
System.Console.WriteLine(department.Studies.First().Title.Value);

// DepartmentTitle and StudyTitle are simple complex types with a Value property
Was it helpful?

Solution

Your Study class needs a public or protected parameterless constructor to work with lazy loading: MSDN

OTHER TIPS

You need to actually load Studies:

department.Studies.Load();
System.Console.WriteLine(department.Studies.First().Title.Value);

Otherwise they won't exist and First() will crash.

So either you Include() your entity for eager loading, or you Load() it later in a lazy way.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top