如何正确使用EF4导航属性?

时间:2011-03-19 15:11:03

标签: database entity-framework entity-framework-4 associations self-tracking-entities

我使用EF4模型优先方法创建了一个数据库。在我的模型中,两个实体之间存在N对M的关系:

enter image description here

我在数据库中填充了一些虚拟数据,包括3个类型为Diagnosis的记录和3个类型为TreatmentSchema的记录以及它们之间的关联。这是我用来执行此操作的代码段:

using(var container = new SmartTherapyContainer()) {
  var diagnosisA = new Diagnosis() { Id = Guid.NewGuid(), Name = "Diagnosis A" };
  var diagnosisB = new Diagnosis() { Id = Guid.NewGuid(), Name = "Diagnosis B" };
  var diagnosisC = new Diagnosis() { Id = Guid.NewGuid(), Name = "Diagnosis C" };
  container.Diagnoses.AddObject(diagnosisA);
  container.Diagnoses.AddObject(diagnosisB);
  container.Diagnoses.AddObject(diagnosisC);

  var schemaA = new TreatmentSchema() { Id = Guid.NewGuid(), Name = "Schema 1" };
  var schemaB = new TreatmentSchema() { Id = Guid.NewGuid(), Name = "Schema 1" };
  var schemaC = new TreatmentSchema() { Id = Guid.NewGuid(), Name = "Schema 1" };
  container.Schemas.AddObject(diagnosisA);
  container.Schemas.AddObject(diagnosisB);
  container.Schemas.AddObject(diagnosisC);

  diagnosisB.TreatmentSchemas.Add(schemaA);
  diagnosisC.TreatmentSchemas.Add(schemaA);
  diagnosisC.TreatmentSchemas.Add(schemaB);
  diagnosisC.TreatmentSchemas.Add(schemaC);

  container.SaveChanges();
}

我验证了关联确实存储在通过EF4映射创建的引用表中。但是,当我稍后通过Diagnosis集合检索container.Diagnoses时,其.TreatmentSchemas集合始终为空。

我尝试调试EF4生成的代码,它所做的只是懒惰地创建所述集合,但它没有用相关对象填充它。 Ayende的实体框架分析器显示在访问该属性时根本没有生成任何查询,这使我相信我在这里做错了。

如何获取关联的TreatmentSchemas

列表

1 个答案:

答案 0 :(得分:2)

默认情况下不加载导航属性。您必须使用预先加载或延迟加载,但因为您使用的是自我跟踪实体,您的选择只是急切加载,因为STEs don't support lazy loading。因此,如果您想获得所有相关TreatmentSchemas的Diagonstic实例,您必须致电:

var diagnosis = context.Diagnoses.Include("TreatmentSchemas").FirstOrDefault();