Как исправить «циклы или несколько каскадных путей»? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть три объекта:

ApplicationUser:

public class ApplicationUser : IdentityUser<Guid>
{
    // more properties
    public List<MeetingNotification> MeetingNotifications { get; set; }
}

MeetingNotifications:

public class MeetingNotification
{
    public Guid Id { get; set; }
    public Guid MeetingId { get; set; }
    public Meeting Meeting { get; set; }
    public Guid SummonedUserId { get; set; }
    public ApplicationUser SummonedUser { get; set; }
}

Meetings:

public class Meeting
{
    public Guid Id { get; set; }
    // more properties
    public Guid OrganizerId { get; set; }
    public ApplicationUser Organizer { get; set; }
    public List<MeetingNotification> Notifications { get; set; }
}

Отношения как таковые:

  • Один ApplicationUser имеет много MeetingNotification s
  • Один MeetingNotification имеет один ApplicationUser и один Meeting
  • Один Meeting имеет много MeetingNotification s

Когда я пытаюсь update-database, я получаю сообщение об ошибке

Введение ограничения FOREIGN KEY 'FK_MeetingNotifications_Meetings_MeetingId' в таблице 'MeetingNotifications 'может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, или измените другие ограничения FOREIGN KEY.

Эта ошибка - мой заклятый враг, поскольку я изо всех сил пытаюсь понять, была ли ошибка ложью. Это в Meeting или в MeetingNotification. Или где-нибудь еще?

Я пробовал эти три определения:

modelBuilder.Entity<MeetingNotification>()
    .HasOne(m => m.Meeting)
    .WithMany(n => n.Notifications)
    .HasForeignKey(fk => fk.Id).OnDelete(DeleteBehavior.NoAction);

modelBuilder.Entity<MeetingNotification>()
    .HasOne(m => m.Meeting)
    .WithMany(n => n.Notifications)
    .HasForeignKey(fk => fk.MeetingId).OnDelete(DeleteBehavior.NoAction);

modelBuilder.Entity<Meeting>()
    .HasMany(n => n.Notifications)
    .WithOne(m => m.Meeting)
    .HasForeignKey(fk => fk.MeetingId).OnDelete(DeleteBehavior.NoAction);

... но они, похоже, ничего не делают. Это одно и то же сообщение об ошибке каждый раз

Обновление

Наконец-то я нашел способ!

modelBuilder.Entity<MeetingNotification>()
    .HasOne(m => m.Meeting)
    .WithMany(n => n.Notifications)
    .OnDelete(DeleteBehavior.Restrict);

... и ошибка исчезла ! Но я не совсем понимаю, почему, поэтому будет полезно любое хорошее объяснение!

...