在EF中填充POCO类之间的关系

时间:2016-01-07 19:19:46

标签: entity-framework entity-relationship poco

我正在尝试为从现有数据中提取数据的项目设置种子。给我带来麻烦的部分是如何在导入数据时设置表之间的关系。

I have three tables:
1) Patient
2) InsuranceProvider
3) Doctors

基本上,患者有保险提供者,保险提供者每个人都有几位医生可供患者选择。我已经设置了以下实体。

public class Patient
{
  public int Id {get; set;}
  public string Name {get; set;}
  public int LegacyInsuranceProviderId {get; set;}
  public int InsuranceProviderId {get; set;}
  public virtual InsuranceProvider insuranceProvider {get; set;}
}

public class InsuranceProvider
{
  public int Id {get; set;}
  public int LegacyId {get; set;}
  public string CompanyName {get; set;}
  public virtual ICollection<Patient> patients {get; set;}
  public virtual ICollection<Doctor> doctors {get; set;}
}

public class Doctor
{
  public int Id {get; set;}
  public string DoctorFullName {get; set;}
  public int LegacyInsuranceProviderIdId {get; set;}
  public int InsuranceProviderId {get; set;}
  public virtual InsuranceProvider insuranceProvider {get; set;}
}

这些类都有一个名为“Legacy ...”的字段,它表示相应表的先前主键。我这样做是因为我不会忘记关系,因为将为每个表生成新的主键。

我无法弄清楚如何填充这些类之间的关系。

1 个答案:

答案 0 :(得分:1)

你的设置对我来说很好。

使用的virtual关键字通知实体框架该字段是&#34;导航属性&#34;。通过在两者之间构建连接,它可以使用此信息在查询时加载数据。您所要做的就是访问连接,它将填充数据。有两种方式。

让我们假设我们在一个使用块(或注入类)中,它具有db作为DbContext的已实例化对象。

第一种方式将通过延迟加载。这里的doctorPatients变量现在将包含该医生的病历列表。 注意:如果已经处理了db,延迟加载将导致抛出异常。

var doctor = db.Set<Doctor>().Find(1);//get a Doctor by primary key
var doctorPatients = doctor.insuranceProvider.patients;

第二种方式将通过急切加载。这使用Include方法指示查询在获取数据时加入,并因此返回相关信息。

var doctorWithPatients = db.Set<Doctor>.Include(d => d.insuranceProvider.patients).Find(1);