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