Добавление миграции, обновление базы данных может привести к циклам или нескольким каскадным путям

#asp.net-core #entity-framework-core

Вопрос:

У меня есть объект пациента, у которого есть один объект файла пациента, и объект файла пациента имеет 3 свойства с одним физиотерапевтом.

 public class PatientFile 
    {
        public int Id { get; set; }
        public Patient Patient { get; set; }
        public int PatientId { get; set; }
        public Physiotherapist IntakeDoneBy { get; set; }
        public int? IntakeDoneById { get; set; }
        public Physiotherapist Supervisor { get; set; }
        public int? SupervisorId { get; set; }
        public Physiotherapist Physiotherapist { get; set; }
        public int? PhysiotherapistId { get; set; }
}

 public class Physiotherapist
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
    }
 

Мой onModelCreate выглядит так:

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

            modelBuilder.Entity<Patient>()
           .HasOne(p => p.PatientFile)
           .WithOne(pf => pf.Patient)
           .HasForeignKey<PatientFile>(p => p.PatientId)
           .OnDelete(DeleteBehavior.Restrict);

            modelBuilder.Entity<PatientFile>()
            .HasOne<Physiotherapist>(pf => pf.IntakeDoneBy)
            .WithMany()
            .HasForeignKey(pf => pf.IntakeDoneById)
            .OnDelete(DeleteBehavior.Restrict);

            modelBuilder.Entity<PatientFile>()
            .HasOne<Physiotherapist>(pf => pf.Physiotherapist)
            .WithMany()
            .HasForeignKey(pf => pf.PhysiotherapistId)
            .OnDelete(DeleteBehavior.Restrict);

            modelBuilder.Entity<PatientFile>()
            .HasOne<Physiotherapist>(pf => pf.Supervisor)
            .WithMany()
            .HasForeignKey(pf => pf.SupervisorId)
            .OnDelete(DeleteBehavior.Restrict);
            }
 

Но после добавления базы данных миграции и обновления я получаю ошибку:

Введение ограничения ВНЕШНЕГО КЛЮЧА «FK_PatientFile_Physiotherapists_PhysiotherapistId» в таблицу «Файл пациента» может привести к циклам или нескольким каскадным путям. Укажите ПРИ УДАЛЕНИИ БЕЗ ДЕЙСТВИЯ или ПРИ ОБНОВЛЕНИИ БЕЗ ДЕЙСТВИЯ или измените другие ограничения ВНЕШНЕГО КЛЮЧА. Не удалось создать ограничение или индекс. См. Предыдущие ошибки.

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

Комментарии:

1. Какое-либо свойство навигации по коллекции (подобное ICollection<PatientFile> или подобное) в Physiotherapist классе, не показанное здесь?

2. Физиотерапевт не обладает таким навигационным свойством, как ICollection<PatientFile>

3. Пустота WithMany() может быть причиной.. Если вы определите эти свойства навигации (по одному для каждого, показанного здесь), это может решить проблему.

4. Поэтому я бы добавил ICollection<PatientFile> PhysiotherapistOfPatientsFiles и ICollection<PatientFile> SupervisorOfPatientsFiles и ICollection<PatientFile> IntakeDoneOfPatientsFiles в Physiotherapist класс ?

5. Нет необходимости определять такие коллекции (пустые WitMany() -это прекрасно). Проблема была бы в том, если бы у вас были такие коллекции , но вы не отображали их внутри HasMany(e => e.SomeCollection) , отсюда мой предыдущий вопрос.

Ответ №1:

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