Как релизовать каскадное удаление в данном случае?

184
06 апреля 2022, 15:40

Нужно реализовать возможность системы подписок с помощью ef core 3.1

Имеется два класса,один с юзерами другой с подписками,каждый юзер может быть и публикатором и подписчиком соответственно. В настройке связи many-to-many проблем нет,но вот при настройке удаления компилятор ссылается на multiply cascade paths. Если поставить одно из свойств на Restrict база данных инициализируется,но при удалении юзера ключ которого есть в restrict поле происходит та же ошибка.

Как изменить код или структуру таблиц чтоб сделать возможным подписку юзеров,а также правильное удаление всех связанных записей при удалении самого юзера?

Сущность юзера:

public class User
{
    public int Id { get; set; }
    public int HashCode { get; set; }
    public ICollection<Subscribe> Followers { get; set; }
    public ICollection<Subscribe> Publishers { get; set; }
    public User()
    {
        Publishers = new List<Subscribe>();
        Followers = new List<Subscribe>();
    }

}

Сущность подписок:

public class Subscribe
{
    public int Id { get; set; } 
    public int FollowerId { get; set; }
    public User Follower { get; set; }
    public int PublisherId { get; set; }
    public User Publisher { get; set; }
}

Контекст базы данных(здесь основная проблема):

public class MDContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Subscribe> Subscribes { get; set; }

        public MDContext(DbContextOptions<MDContext> options)
            : base(options)
        {
            Database.EnsureDeleted();
//На данном этапе разработки удаление базы не страшно
            Database.EnsureCreated();
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Subscribe>().HasKey(s => new { s.FollowerId, s.PublisherId });
            modelBuilder.Entity<Subscribe>()
                        .HasOne(s => s.Follower)
                        .WithMany(f => f.Publishers)
                        .HasForeignKey(s => s.FollowerId)
                        .OnDelete(DeleteBehavior.Cascade);
            modelBuilder.Entity<Subscribe>()
                        .HasOne(s => s.Publisher)
                        .WithMany(p => p.Followers)
                        .HasForeignKey(s => s.PublisherId)
                        .OnDelete(DeleteBehavior.Restrict);



        }
    }
READ ALSO
на C# написать сервер (win/lin) + клиенты (win/lin) ...глупая идея?

на C# написать сервер (win/lin) + клиенты (win/lin) ...глупая идея?

Нахожусь в начале пути освоения C#Пока весьма мутно представляю его возможности в полной мере

173
Как работает сборщик мусора с неуправляемыми типами

Как работает сборщик мусора с неуправляемыми типами

Знаю что сборщик мусора очищает только управляемые типы в управляемой кучеДля неуправляемых есть интерфейс IDisposable

88
Почему нету результата в моем коде C#?

Почему нету результата в моем коде C#?

сделал метод Cycle и все переменные статическими, чтобы можно было вызывать без создания объекта класса Program

206