Первый подход кода для определения отношения многие ко многим приводит к ошибке mssql о «циклах или множественных каскадных путях» - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь создать несколько таблиц в своей базе данных, используя подход Code First, и мне там тоже нужно отношение «многие ко многим».

Вот определение моих сущностей:

public class User
{
    ...
    public virtual ICollection<UserCourse> UserCourses { get; set; }
}

public class Course
{
    ...
    public virtual ICollection<UserCourse> UserCourses { get; set; }
}

public class UserCourse
{
    public int UserId { get; set; }
    public User User { get; set; }

    public int CourseId { get; set; }
    public Course Course { get; set; }
}

Затем мне пришлось сказать EF Core, что я хочу, чтобы это были отношения M-M:

// set many-to-many relationship between user and course

modelBuilder.Entity<UserCourse>()
    .HasKey(uc => new {uc.UserId, uc.CourseId});

modelBuilder.Entity<UserCourse>()
    .HasOne(uc => uc.User)
    .WithMany(u => u.UserCourses)
    .HasForeignKey(uc => uc.UserId);

modelBuilder.Entity<UserCourse>()
    .HasOne(uc => uc.Course)
    .WithMany(c => c.UserCourses)
    .HasForeignKey(uc => uc.CourseId);

Я не указал DeleteBehavior для своих сущностей, поэтому SQL Server выдал мне ошибку:

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

Поэтому я искал некоторые решения и обнаружил, что мне нужно указать DeleteBehaviour. Я сделал это так:

// set ondelete to be restrict

modelBuilder.Entity<UserCourse>()
     .HasOne(uc => uc.User)
     .WithMany(u => u.UserCourses)
     .Metadata.DeleteBehavior = DeleteBehavior.Restrict;

modelBuilder.Entity<UserCourse>()
     .HasOne(uc => uc.Course)
     .WithMany(c => c.UserCourses)
     .Metadata.DeleteBehavior = DeleteBehavior.Restrict;

Хотя SQL Server попросил меня изменить OnDelete на NO ACTION, в перечислении DeleteBehavior не было NO ACTION. Вместо этого, это находится в перечислении ReferentialAction, которое является перечислением для миграций, поэтому я не могу коснуться его вручную (я имею в виду, что это будет плохим решением). Люди в интернете говорят, что Restrict - это именно то, что я ищу здесь. Хорошо. Ну, тогда проблема должна быть решена, верно? К сожалению, абсолютно нет.

SQL Server все еще выдает мне ту же ошибку:

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

Я вообще не знаю, что с этим делать. Я попробовал почти все, хотя я не настолько опытен в подходе EF Core Code-first.

Мой вопрос прост: как мне решить эту проблему?

1 Ответ

0 голосов
/ 14 апреля 2019

Мне помогло удаление всех миграций и инициализация новой (первой) миграции.

Для этого выполните следующие действия:

  1. Удалите папку Migrations из вашего проекта.
  2. Удалить таблицу __EFMigrationsHistory из БД (таблица удаления __EFMigrationsHistory)
  3. Введите в консоли диспетчера пакетов следующее: «Начальная установка-миграция»
  4. Введите в консоли диспетчера пакетов следующее: «update-database»
...