2011-02-27 19 views
5

Mam kilka tabel, które odnoszą się do siebie nawzajem ze związkami wiele do wielu, ale nie są normalne.Entity Framework wiele do wielu relacji bez klucza podstawowego

Zwykle relacja wiele do wielu ma tabelę łączenia, która łączy dwie pozostałe tabele na ich głównych kluczach.

W moim przypadku mam kilka tabel, które odnoszą się do siebie, dzieląc pasujące klucze obce.

Mam zapisy pacjentów z dwoma tabelami.

  1. Lekarze przypisani do pacjenta.
  2. Wyniki testu pacjentów.

Nie wolno mi przechowywać niczego na temat pacjenta oprócz jego identyfikatora pacjenta (i nie mam powodu), więc nie ma sensu w stole pacjenta.

Jak mogę powiązać Lekarzy z TestResults?

Oboje mają klucz obcy do tabeli, która nie istnieje. tj. oba mają numery rekordów pacjenta, ale nie ma tabeli numerów rekordów pacjentów (numery rekordów są generowane przez system, do którego nie mam dostępu).

Tak więc w rzeczywistości są ze sobą w wielu związkach.


Pomyślałem o zrobieniu stołu tylko po to, by przechowywać identyfikatory. Ta tabela będzie miała jedną kolumnę, która jest kluczem podstawowym i niczym więcej.

To rozwiązanie w ogóle nie działa.

  • Moja agnostyczna biblioteka przechowywania (poco), która będzie zarządzać i analizować te zapisy, nie byłaby w stanie sprawdzić, czy pacjent był w naszym systemie podczas dodawania nowego wyniku testu.
  • Nawet jeśli przekazałem kontekst bazy danych do biblioteki zarządzającej. Oznaczałoby to, że system musiałby wywoływać bazy danych za każdym razem, gdy chciałby dodać rekord testowy tylko po to, aby zobaczyć, czy pacjent miał jakiekolwiek wcześniejsze zapisy u nas, czy był to pierwszy. Wszystko, aby dodać rekord w tabeli, która nie miała żadnego celu. W szczytowych czasach przetwarzania może to być tysiące razy na minutę. Coś, co byłoby trywialne, gdybyś miał dostęp do obiektów klr, ale całkowicie przytłaczające, jeśli potrzebujesz wywołać bazę danych dla każdego z nich.

Dziękujemy!

+1

To łamie zasady modelowania bazy relacyjnej więc nie będzie obsługiwany z zewnątrz stół most połączyć Zapisy –

+0

Jestem prawie pewien, że pacjent musi istnieć w tym, co próbuje zrobić. – Derek

Odpowiedz

0

Jako trywialny i prawdopodobnie nie do przyjęcia, aby wymusić relację opisywaną na poziomie fizycznym, musi istnieć stół pacjenta. Wówczas związek wzorowany jest po prostu jak poniżej:

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

A SQL tylko dla jasności:

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) 
) 
Powiązane problemy