我正在尝试为从现有数据中提取数据的项目设置种子。给我带来麻烦的部分是如何在导入数据时设置表之间的关系。
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 ...”的字段,它表示相应表的先前主键。我这样做是因为我不会忘记关系,因为将为每个表生成新的主键。
我无法弄清楚如何填充这些类之间的关系。
答案 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);