我正在使用Entity Framework 6加载树结构。由于树中级别的数量,我不想使用过多的包含,因为叉积太大。我在这里使用一个较小的示例进行解释。
public class Hospital
{
public virtual List<Station> Stations {get;set;}
public virtual Contact Contact {get;set;}
public virtual string Uid {get;set;}
}
public class Station
{
public virtual List<Patient> Patients {get;set;}
public virtual Contact Contact {get;set;}
}
public class Patient
{
public virtual List<Medication> Medications{get;set;}
public virtual string Name {get;set;}
}
我试图做这样的事情:
var hospital = context.Hospitals
.Include(h => h.Contact)
.Where(h => h.Uid == myUid);
var stations = hospital.SelectMany(h => h.Stations).Include(s => s.Contact);
var patients = stations.SelectMany(s => s.Patients);
var medications = patients.SelectMany(p => p.Medications);
var myHospital = hospital.Single();
stations.ToList();
patients.ToList();
medications.ToList();
据我了解,这应该发出4个查询,并且实体框架应该修复内存中的关联。尽管发出了4个查询,但是当我尝试浏览内存中的树时,我注意到Entity Framework仍然是延迟加载。这似乎不适用于站点列表,但适用于叶子水平(例如患者,药物等)
我还注意到,如果禁用延迟加载,则可以轻松地在树中导航,因此数据应该已经加载。但是,我宁愿不禁用延迟加载。
有人可以向我解释为什么EF惰性加载已加载的属性吗?