Entity Framework отношения многие ко многим без первичного ключа - PullRequest
5 голосов
/ 27 февраля 2011

У меня есть несколько таблиц, которые все ссылаются друг на друга с отношениями «многие ко многим», но не имеют нормального вида.

Обычно отношение «многие ко многим» имеет таблицу соединения, которая объединяет две другиетаблицы на их первичных ключах.

В моем случае у меня есть несколько таблиц, которые связаны друг с другом путем совместного использования соответствующих внешних ключей.

У меня есть записи пациентов с двумя таблицами.

  1. Врачи, которые назначены пациенту.
  2. Результаты теста пациента.

Мне не разрешается хранить что-либо о пациенте, кроме его идентификатора пациента (и у меня естьнет причин для этого), поэтому в таблице пациентов нет никакого смысла.

Как я могу связать докторов с TestResults?

Они оба имеют внешний ключ к несуществующей таблице.то есть у них обоих есть номера записей о пациентах, но нет таблицы номеров записей о пациентах (номера записей генерируются системой, к которой у меня нет доступа).

Так что на самом деле они находятся в-множество отношений друг с другом.


Я действительно думал о создании таблицы только для хранения идентификаторов записей.В этой таблице будет один столбец, который является первичным ключом, и ничего больше.

Это решение не будет работать для меня вообще.

  • Моя библиотека хранения данных (poco), которая будетУправление и анализ этих записей не могли бы проверить, был ли пациент в нашей системе при добавлении нового результата теста.
  • Даже если бы я передал Контекст базы данных управляющей библиотеке.Это будет означать, что система должна будет делать вызов в базу данных каждый раз, когда она хочет добавить запись теста, просто чтобы посмотреть, были ли у пациента какие-либо предыдущие записи с нами или это была первая запись.Все, чтобы добавить запись в таблицу, которая не имела цели.Во время пиковой обработки это может быть тысячи раз в минуту.Что-то, что было бы тривиально, если бы вы просто обращались к объектам clr, но было бы крайне сложно, если вам нужно сделать вызов базы данных для каждого из них.

Спасибо!

1 Ответ

0 голосов
/ 20 августа 2014

Для того, чтобы обеспечить соблюдение отношений, которые вы описываете на физическом уровне, как бы это ни было тривиально и, вероятно, запретительно, должен быть стол пациента.Тогда отношения моделируются просто, как показано ниже:

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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...