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

Populating relationships between POCO classes in EF

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

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..." 的字段,它表示各自 table 的先前主键。我这样做是为了不忘记关系,因为将为每个 table.

生成新的主键

我想不通的是如何填充这些 类 之间的关系。

我觉得你的设置不错。

使用的 virtual 关键字通知 entity framework 该字段是 "navigation property"。它可以通过在两者之间构造连接来使用此信息在查询时加载数据。您所要做的就是访问连接,它将填充数据。有两种方法。

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

第一种方式 是延迟加载。这里的 doctorPatients 变量现在将保存该医生的患者列表。 注意:如果db已经被disposed,延迟加载会抛出异常

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

第二种方式 是通过预先加载。这使用 Include 方法指示查询在获取数据时加入,结果将 return 相关信息。

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