2011-02-27 134 views
5

我有几个表,它们都是用多对多的关系互相引用而不是正常的类型。实体框架多对多的关系没有主键

通常,多对多关系具有连接表,该连接表连接主键上的其他两个表。

在我的情况下,我有几个表彼此通过共享匹配的外键相互关联。

我有两张表的病历。

  1. 分配给患者的医生。
  2. 患者检查结果。

我不允许存储除患者身份以外的任何关于患者的信息(我没有理由),因此在患者表中没有任何意义。

我如何将医生与测试结果联系起来?

它们都有一个不存在的表的外键。即它们都具有患者记录号码,但没有患者记录号码表(记录号码由我无法访问的系统生成)。

所以实际上它们处于彼此之间的多对多关系。


我确实想过制作一个表来保存记录ID。该表将有一列是主键,而没有别的。

该解决方案根本不适用于我。

  • 如果添加新的测试结果,我的存储不可知(poco)库将无法检查患者是否在我们的系统中。
  • 即使我确实将数据库上下文传递给管理库。这意味着系统每次需要添加测试记录时都需要进行数据库调用,以查看患者是否有任何以前的记录,或者这是否是第一次。所有在没有目的的表格中添加记录。在高峰处理时间,这可能是每分钟数千次。如果你只是访问clr对象,那么这样做可能是微不足道的,但如果你需要为每一个对象创建一个数据库调用,那么这种做法是完全压倒性的。

谢谢!

+1

这打破了关系数据库建模的规则,所以它不会同出一桥表链接支持记录 – 2011-08-03 05:04:08

+0

我很确定患者需要存在于你想做的事情中。 – Derek 2013-11-29 08:50:18

回答

0

尽管它很微不足道,而且可能过于禁止,但为了强化您在物理层面描述的关系,必须有一张耐心的表格。然后的关系如下简单地建模:

public class Doctor 
{ 
    [Key] 
    public int DoctorId {get; set;} 

    public virtual ICollection<Patient> Patients {get; set;} 
} 

public class Patient 
{ 
    [Key] 
    public int PatientId {get; set;} 

    public virtual ICollection<Doctor> Doctors {get; set;} 

    public virtual ICollection<TestResult> Results {get; set;} 
} 

public class PatientMap : EntityTypeConfiguration<Patient> 
{ 
    public PatientMap() 
    { 
     HasMany(p => p.Doctors) 
     .WithMany(d => d.Patients) 
     .Map(x => { 
     x.ToTable("DoctorPatient"); 
     x.WithLeftKey("PatientId"); 
     x.WithRightKey("DoctorId"); 
     }); 
    } 
} 

public class TestResult 
{ 
    [Key] 
    public int ResultId {get; set;} 

    public int PatientId {get; set;} 

    [ForeignKey("PatientId")] 
    public virtual Patient Patient {get; set;} 
} 

和SQL只是为了清晰:

create table Doctor(
    DoctorId int not null primary key, 
    Name nvarchar(50) not null 
) 

create table Patient(
    PatientId int not null primary key, 
) 

create table DoctorPatient(
    DoctorId int not null, 
    PatientId int not null, 
    primary key (DoctorId, PatientId), 
    foreign key (DoctorId) references Doctor(DoctorId), 
    foreign key (PatientId) references Patient(PatientId) 
) 

create table TestResult(
    ResultId int not null primary key, 
    PatientId int not null, 
    foreign key (PatientId) references Patient(PatientId) 
)