#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:
Я удалил все свои миграции и таблицы базы данных и начал с нуля. я сделал новую первоначальную миграцию, обновил базу данных и не получил никаких ошибок.