Нужна помощь в проектировании стола с Entity Framework Core - PullRequest
0 голосов
/ 16 апреля 2020

Я разрабатываю простое веб-приложение, в котором врач добавляет несколько записей рецептов для пациентов и выбирает несколько препаратов при назначении. Таким образом, один пациент имеет несколько рецептов, а один рецепт имеет несколько выбранных лекарств. Я взял другую таблицу записей о пациентах для целей отчетности / перспективы нормализации, где я ссылаюсь на PatientID и PrescriptionID.

  • Один пациент -> много рецептов -> отношение один ко многим
  • Один рецепт -> много лекарств -> отношения один ко многим

Ниже приведена модель для пациента, рецепт и лекарства, PatientRecord таблица.

PatientModel

DrugModel

PrescriptionModel

PatientRecordModel

Во время выполнения миграции я получаю эту ошибку:

Номер ошибки: 1769, Состояние: 1, Класс: 16
Внешний ключ 'FK_Drugs_Prescription_PrescriptionID' ссылается на недопустимый столбец 'PrescriptionID' в ссылке таблица «Наркотики».

Меня смущает объяснение отношений «один ко многим» на веб-сайте Microsoft.

Кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Существует два способа настройки отношений в EF Core

  • Условные обозначения: по умолчанию связь создается при обнаружении свойства навигации в тип. Неприменимо для отношения «многие ко многим»

  • Свободный API: вы начинаете с определения свойств навигации, которые составляют отношение. HasOne или HasMany идентифицирует свойство навигации для типа объекта, для которого вы начинаете настройку. HasOne/WithOne используются для справочных навигационных свойств, а HasMany/WithMany используются для коллекционных навигационных свойств.

Из ваших снимков экрана и предложенного Бенджамина вы можете настроить модель, как показано ниже

Пациент - рецепт -> отношения один ко многим рецепт - лекарство -> отношения многие ко многим

public class Prescription
{
    public int PrescriptionId { get; set; }
    [Required]
    public string Description { get; set; }
    [Required]
    public DateTime PrescriptionDate { get; set; }

    public int PatientId { get; set; }

    public Patient Patient { get; set; }

    public ICollection<DrugPrescription> DrugPrescriptions { get; set; }
}
public class Drug
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
    [Required]
    public int CurrentStock { get; set; }
    public int DrugCost { get; set; }
    public string Description { get; set; }

    public ICollection<DrugPrescription> DrugPrescriptions { get; set; }
}

//represent a many-to-many relationship by including an entity class for 
//the join table and mapping two separate one-to-many relationships.
 public class DrugPrescription
{
    public int DrugId { get; set; }
    public Drug Drug { get; set; }

    public int PrescriptionId { get; set; }
    public Prescription Prescription { get; set; }
}


//DbContext
public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {}

    public DbSet<Patient> Patient { get;set; }
    public DbSet<Drug> Drug { get;set; }
    public DbSet<Prescription> Prescription { get;set; }

    public DbSet<PatientRecord> PatientRecord { get; set; }


    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        #region Drug-Prescription Many-to-Many
        builder.Entity<DrugPrescription>()
            .HasKey(dp => new { dp.DrugId, dp.PrescriptionId });

        builder.Entity<DrugPrescription>()
            .HasOne(dp => dp.Prescription)
            .WithMany(p => p.DrugPrescriptions)
            .HasForeignKey(dp => dp.PrescriptionId)
            .OnDelete(DeleteBehavior.Restrict);

        builder.Entity<DrugPrescription>()
            .HasOne(dp => dp.Drug)
            .WithMany(d => d.DrugPrescriptions)
            .HasForeignKey(dp => dp.DrugId)
            .OnDelete(DeleteBehavior.Restrict);
        #endregion

    }
}
0 голосов
/ 16 апреля 2020

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

Во-первых, меня немного смущает ваш класс PatientRecord. Он идентифицирует себя с PatientRecordId и сопоставляется с Patient, но не добавляет никакой другой информации, так для чего он нужен? Если вы не собираетесь добавлять что-либо в этот класс, я думаю, вы можете удалить это из модели.

Во-вторых, ваш класс Prescription отображается в коллекцию Drugs. Это прекрасно, потому что между ними есть отношение один ко многим ... так почему же оно имеет целочисленное свойство DrugId? Если вы не хотите, чтобы класс Prescription ссылался на Id одного Drug, а также на коллекцию Drugs, я думаю, вам следует удалить его. Это может сбивать с толку Entity Framework и не давать вам никакого значения.

В-третьих, ваш класс Drug отображается на один Prescription (через его свойства Prescription и PrescriptionId), но почему? Предположительно, лекарство может появляться по нескольким рецептам, так как его можно назначать многим людям или назначать одному и тому же человеку несколько раз. Поэтому я думаю, что вы тоже хотите удалить это и заменить его отношением «многие ко многим».

Наконец, если вы хотите иметь отношение «многие ко многим» между Prescription и Drug ( и я думаю, что вы это сделаете) вам, вероятно, нужно добавить класс DrugPrescription, со свойством Drug и свойством Prescription, чтобы создать это отображение «многие ко многим».

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

...