@Razraaab

Почему связи в таблице работают неправильно?

Есть бд в проекте и хочу чтобы мой юзер мог создавать участки кода и они сохранялись в бд, также юзер может лайкать чужой код, и эти лайкнутые CodeSnippet попадают к нему в свойство LikedCodeSnippets, и в его отношение CodeSnippet в свойство UsersWhoLiked, почему-то это работает, при запуске проекта получаю вот такую ошибку: "Microsoft.Data.SqlClient.SqlException (0x80131904): Introducing FOREIGN KEY constraint 'FK_CodeSnippetUser_Users_UsersWhoLikedId' on table 'CodeSnippetUser' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints"

В свойстве CodeSnippets хранится код созданный им если что

Вот код контекста бд:
public class DatabaseContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<CodeSnippet> CodeSnippets { get; set; }

    public DatabaseContext(DbContextOptions options) : base(options)
    {
        Database.EnsureCreated();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasMany(u => u.CodeSnippets)
            .WithOne(c => c.User).HasForeignKey(c => c.UserId);
        modelBuilder.Entity<User>().HasMany(u => u.LikedCodeSnippets)
            .WithMany(c => c.UsersWhoLiked);
    }
}

А вот мои 2 модели:

User
public class User
    {
        public int Id { get; set; }
        public string? Name { get; set; }
        public required string Email { get; set; }
        public required string HashPassword { get; set; }
        public List<CodeSnippet> CodeSnippets { get; set; } = new List<CodeSnippet>();
        public List<CodeSnippet> LikedCodeSnippets { get; set; } = new List<CodeSnippet>();
        public IdentityData? IdentityData { get; set; }
    }

CodeSnippet:
public class CodeSnippet
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public User User { get; set; } = null!;
        public List<User> UsersWhoLiked { get; set; } = new List<User>();
        public required string Title { get; set; }
        public required string Description { get; set; }
        public required string Content { get; set; }
        public required string Tag { get; set; }
    }
  • Вопрос задан
  • 179 просмотров
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
Надо изменить поведение внешних ключей при удалении. Если, как я полагаю, вы рабоаете с EF Core, то для этого в OnModelCreating нужно вызвать метод OnDelete (информация, ссылка на документацию и примеры - здесь).
В EF6 (для .NET Framework) вместо этого был метод WillCascadeOnDelete(false)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
NikFaraday
@NikFaraday
Student full-stack Developer
Господи, изучите сначала теорию о работе с базами данных, перед тем как задавать такие вопросы, потому что это просто смешно уже...

Во первых, если вам нужно установить связь между этим
public List<CodeSnippet> LikedCodeSnippets { get; set; } = new List<CodeSnippet>();


И этим
public List<User> UsersWhoLiked { get; set; } = new List<User>();


Вам нужна дополнительная таблица. Почему? Потому что тут связь много-ко-многим. Вот она:
public sealed class UserCodes
{
    public int UserId { get; set; }
    public User User { get; set; }

    public int CodeId { get; set; }
    public CodeSnippet Code { get; set; }
}


Через эту таблицу далее конфигурируете связь много-ко-многим

Что значит эта запись?
public User User { get; set; } = null!;

В чём смысл говорить, что она null и ставить ! как обозначение того, что она not null?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы