在 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);
我正在尝试为从现有数据中提取数据的项目设置播种。给我带来麻烦的部分是如何在导入数据时设置 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);