2011-02-27 21 views
5

Tengo algunas tablas que todas se refieren entre sí con relaciones de muchos a muchos pero no del tipo normal.Entity Framework relación muchos a muchos sin clave primaria

Por lo general, una relación de muchos a muchos tiene una tabla de unión que une las otras dos tablas en sus claves principales.

En mi caso, tengo algunas tablas que se relacionan entre sí al compartir claves extranjeras coincidentes.

Tengo registros de pacientes con dos tablas.

  1. Médicos asignados a un paciente.
  2. Los resultados de las pruebas de los pacientes.

No tengo permitido almacenar nada sobre el paciente además de su identificación del paciente (y no tengo ninguna razón para hacerlo), por lo que no tiene sentido una tabla de pacientes.

¿Cómo podría relacionar a los médicos con los resultados de la prueba?

Ambos tienen una clave externa a una tabla que no existe. es decir, ambos tienen números de registro de pacientes, pero no hay una tabla de números de registro de pacientes (los números de registro son generados por un sistema al que no tengo acceso).

De hecho, están en una relación de muchos a muchos entre sí.


Pensé en hacer una tabla solo para guardar los identificadores de registro. Esa tabla tendría una columna que es la clave principal y nada más.

Esa solución no me funcionaría en absoluto.

  • Mi biblioteca agnostic (poco) de almacenamiento que estaría gestionando y analizando estos registros no tendría manera de verificar si un paciente estaba en nuestro sistema al agregar un nuevo resultado de prueba.
  • Incluso si pasé un Contexto de base de datos a la biblioteca de gestión. Eso significaría que el sistema tendría que realizar una llamada a la base de datos cada vez que quisiera agregar un registro de prueba solo para ver si el paciente tenía algún registro previo con nosotros o si este era el primero. Todo para agregar un registro en una tabla que no tenía ningún propósito. Durante los tiempos pico de procesamiento, esto podría ser miles de veces por minuto. Algo que sería trivial si solo accede a objetos clr, pero es totalmente abrumador si necesita hacer una llamada a la base de datos para cada uno.

¡Gracias!

+1

Esto rompe las reglas de modelado de base de datos relacional por lo que no sería apoyada con una mesa de puente para enlazar los registros –

+0

Estoy bastante seguro de que un paciente debe existir en lo que intenta hacer. – Derek

Respuesta

0

Tan trivial y probablemente prohibitivo como es, para hacer cumplir la relación que describes a nivel físico, tiene que haber una tabla de pacientes. Entonces la relación se modela simplemente como a continuación:

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;} 
} 

Y el SQL simplemente para mayor claridad:

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) 
) 
Cuestiones relacionadas