Цикл в моделях в ядре Entity Framework - PullRequest
0 голосов
/ 11 июля 2019

Представьте, что эти модели являются частью приложения для социальной сети. 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 вручную , и проблем нет. enter image description here

Есть как минимум два способа это исправить. Но я хочу знать, почему EF Core говорит, что есть цикл. В чем проблема?

1 Ответ

1 голос
/ 23 июля 2019

Я думаю, что у вашего бриджа есть проблема.

Попробуйте это

public class GroupMember: BaseEntity
{
public User User { get; set; }
[Key, Column(Order = 0)]
public int UserId { get; set; }

public Group Group { get; set; }
[Key, Column(Order = 1)]
public int GroupId { get; set; }
}
...