Представьте, что эти модели являются частью приложения для социальной сети. User
может сделать Group
и может добавлять в него других пользователей (как участников), а пользователь может быть членом группы. Я использую ядро .net, а также ядро сущности.
Модели:
public class User : BaseEntity
{
public string UserName { get; set; }
public IList<Group> OwnGroups { get; set; }
public IList<GroupMember> MemberInGroups { get; set; }
}
public class Group : BaseEntity
{
public string Name { get; set; }
public int OwnerUserId { get; set; }
[ForeignKey("OwnerUserId")]
public User OwnerUser { get; set; }
public IList<GroupMember> Members { get; set; }
}
public class GroupMember : BaseEntity
{
public int GroupId { get; set; }
public int UserId { get; set; }
[ForeignKey("UserId")]
public User User { get; set; }
[ForeignKey("UserId")]
public Group Group { get; set; }
}
Свободный API:
modelBuilder.Entity<User>()
.HasMany(x => x.OwnGroups)
.WithOne(x => x.OwnerUser).HasForeignKey(x => x.OwnerUserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<User>()
.HasMany(x => x.MemberInGroups)
.WithOne(x => x.User).HasForeignKey(x => x.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<Group>()
.HasMany(x => x.Members)
.WithOne(x => x.Group).HasForeignKey(x => x.GroupId).IsRequired().OnDelete(DeleteBehavior.Cascade);
Когда я хочу выполнить миграцию в базу данных, возникает эта ошибка:
Введение ограничения FOREIGN KEY 'FK_GroupMembers_Users_UserId' в таблицу 'GroupMembers' может привести к возникновению циклов или нескольких каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY.
Не удалось создать ограничение или индекс. Смотрите предыдущие ошибки.
Однако я могу сделать эту модель в SQL Server
вручную , и проблем нет.
Есть как минимум два способа это исправить. Но я хочу знать, почему EF Core
говорит, что есть цикл. В чем проблема?