C# 实体框架渴望加载关联的集合,但赢得';不要懒洋洋地装它

C# 实体框架渴望加载关联的集合,但赢得';不要懒洋洋地装它,c#,.net,entity-framework,entity-framework-6.1,C#,.net,Entity Framework,Entity Framework 6.1,我已尝试将部门对象的研究属性设置为延迟加载,但只有当我急切地加载它时,它才会加载。我在研究课程中添加了一个部门ID,但没有结果,使用了ICollection、ISet和虚拟。公共和私人设定者似乎没有什么区别(也不应该如此)。似乎什么都不管用。使用EF 6.1 public class Department { private Department() {} public Department(DepartmentTitle title) { if (title == nul

我已尝试将
部门
对象的
研究
属性设置为延迟加载,但只有当我急切地加载它时,它才会加载。我在
研究
课程中添加了一个
部门ID
,但没有结果,使用了
ICollection
ISet
虚拟
。公共和私人设定者似乎没有什么区别(也不应该如此)。似乎什么都不管用。使用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
公共课部
{
私人部门(){}
公共部门(部门名称)
{
如果(title==null)抛出新ArgumentNullException();
这个.Title=Title;
this.Studies=newhashset();
}
public int DepartmentId{get;private set;}
公共虚拟部门标题{get;private set;}
公共虚拟ICollection研究{get;set;}
}
公开课学习
{
私人学习(){}
公共研究(研究标题,系)
{
如果(title==null)抛出新ArgumentNullException();
如果(department==null)抛出新ArgumentNullException();
这个.Title=Title;
这个。部门=部门;
}
public int StudyId{get;private set;}
公共虚拟studytile标题{get;private set;}
公共虚拟部门部门{get;set;}
}
//在这里,我保存了部门和研究对象
//我验证了它们存在于数据库中
var部门=新部门(新部门名称(“此处的部门名称”);
department.Studies.Add(新研究(newstudytile)(“此处的研究标题”),department);
data.SaveChanges();
//在新的数据库上下文中
//在这里,我尝试延迟加载Studies属性,但得到null
//如果我在Where()之前添加Include(“研究”),它会起作用
Department Department=data.Departments.Where(d=>d.Title.Value==“此处的部门名称”).Single();
System.Console.WriteLine(department.Studies.First().Title.Value);
//DepartmentTitle和StudyTitle是具有Value属性的简单复杂类型

您的学习类需要公共或受保护的无参数构造函数来处理延迟加载:

您的学习类需要公共或受保护的无参数构造函数来处理延迟加载:

您的学习类需要公共或受保护的无参数构造函数来处理延迟加载:

您的学习类需要公共或受保护的无参数构造函数使用延迟加载:

您需要实际加载研究:

department.Studies.Load();
System.Console.WriteLine(department.Studies.First().Title.Value);
否则它们将不存在,
First()
将崩溃


因此,要么你
Include()
你的实体进行急切加载,要么你
Load()
以后以一种懒惰的方式加载它。

你需要实际加载研究:

department.Studies.Load();
System.Console.WriteLine(department.Studies.First().Title.Value);
否则它们将不存在,
First()
将崩溃


因此,要么你
Include()
你的实体进行急切加载,要么你
Load()
以后以一种懒惰的方式加载它。

你需要实际加载研究:

department.Studies.Load();
System.Console.WriteLine(department.Studies.First().Title.Value);
否则它们将不存在,
First()
将崩溃


因此,要么你
Include()
你的实体进行急切加载,要么你
Load()
以后以一种懒惰的方式加载它。

你需要实际加载研究:

department.Studies.Load();
System.Console.WriteLine(department.Studies.First().Title.Value);
否则它们将不存在,
First()
将崩溃


因此,要么您
包含()
您的实体以进行快速加载,要么您
稍后以惰性方式加载()
它。

这很奇怪,但它是有效的。我认为这没什么区别,因为它到处都说EF如何“仅仅”使用反射来访问它需要的任何东西。显然不是。我希望我在几周前偶然发现这个。我一直在绞尽脑汁想弄明白为什么懒散加载对我的实体不起作用。在我的实体上有一个私有的无参数构造函数,它可以很好地与EF一起从数据库加载实体。将其更改为protected,惰性加载最终起作用。啊!!这很奇怪,但它是有效的。我认为这没什么区别,因为它到处都说EF如何“仅仅”使用反射来访问它需要的任何东西。显然不是。我希望我在几周前偶然发现这个。我一直在绞尽脑汁想弄明白为什么懒散加载对我的实体不起作用。在我的实体上有一个私有的无参数构造函数,它可以很好地与EF一起从数据库加载实体。将其更改为protected,惰性加载最终起作用。啊!!这很奇怪,但它是有效的。我认为这没什么区别,因为它到处都说EF如何“仅仅”使用反射来访问它需要的任何东西。显然不是。我希望我在几周前偶然发现这个。我一直在绞尽脑汁想弄明白为什么懒散加载对我的实体不起作用。在我的实体上有一个私有的无参数构造函数,它可以很好地与EF一起从数据库加载实体。将其更改为protected,惰性加载最终起作用。啊!!这很奇怪,但它是有效的。我认为这没什么区别,因为它到处都说EF如何“仅仅”使用反射来访问它需要的任何东西。显然不是。我希望我在几周前偶然发现这个。我一直在绞尽脑汁想弄明白为什么懒散加载对我的实体不起作用。在我的实体上有一个私有的无参数构造函数,它可以很好地与EF一起从数据库加载实体。将其更改为protected,惰性加载最终起作用。啊+1.我确信这种方法会奏效,但没有。但是,它会把我引向正确的方向,否则它会把别人引向正确的方向。我确信这种方法会奏效,但没有。但是,它会把我引向正确的方向,否则它会把别人引向正确的方向。我确信这种方法会奏效,但没有。但是,它会把我引向正确的方向,否则它会把别人引向正确的方向。我确信这种方法会奏效,但没有。然而,它会把我引向正确的方向,或者它会把其他人引向正确的方向。