Получение ОШИБКИ при обновлении сущности с отношением «многие 2 многие» (JOIN TABLE) - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть 2 сущности, связанные вместе таблицей соединений.Создание статьи работает отлично.При обновлении сущности article выдается это исключение:

SqlException: оператор DELETE конфликтует с ограничением REFERENCE "FK_ArticleGroups_Articles_ArticleID".Конфликт произошел в базе данных «myDB», таблица «dbo.ArticleGroups», столбец «ArticleID».Оператор был прекращен.

Ниже приведены мои уроки и настройки

Article.cs

public class Article
{
    public int ArticleId { get; set; }
    public string Title { get; set; }
    public virtual ICollection<ArticleGroup> ArticleGroups { get; set; } = new List<ArticleGroup>();
}

Group.cs

public class Group
{
   public int GroupId { get; set; }
   public string GroupName { get; set; }
   public virtual ICollection<ArticleGroup> ArticleGroups { get; set; } = new List<ArticleGroup>();
public virtual ICollection<GroupUser> GroupUsers { get; set; } = new List<GroupUser>();
}

ArticleGroup.cs

public class ArticleGroup
{
   public int ArticleId { get; set; }
   public Article Article { get; set; }
   public int GroupId { get; set; }
   public Group Group { get; set; }
}

AppDbContext.cs

protected override void OnModelCreating(ModelBuilder modelBuilder)
{ 
    .....
    modelBuilder.Entity<ArticleGroup>()
            .HasKey(e => new { e.ArticleID, e.GroupId });

        modelBuilder.Entity<ArticleGroup>()
            .HasOne(e => e.Article)
            .WithMany(e => e.ArticleKbGroups)
            .HasForeignKey(e => e.ArticleID)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<ArticleGroup>()
            .HasOne(e => e.Group)
            .WithMany(e => e.ArticleGroups)
            .HasForeignKey(e => e.GroupId)
            .OnDelete(DeleteBehavior.Restrict);
}

public DbSet<Article> Articles { get; set; }
public DbSet<Group> Groups { get; set; }
public DbSet<ArticleGroup> ArticleGroups { get; set; }

ArticleRepository.cs

public bool UpdateArticle(Article article)
    {
        var articleGroups = _appDbContext.ArticleGroups.Where(a => a.ArticleID == article.ArticleID);
        _appDbContext.ArticleGroups.RemoveRange(articleGroups);
        _appDbContext.Articles.Update(article);
        return (_appDbContext.SaveChanges() >= 0);
    }

Я видел похожие проблемы с такими сложными решениямиэто не может сравниться с чем-то тривиальным, как это.Где в EF я неправильно настраиваюсь?Я думаю, что его SQL-операторы не выполняются в правильном порядке?

Я думаю, что план игры будет удалить все из таблицы соединений с тем же articleID и вставить новые значения.

РЕДАКТИРОВАТЬ

Добавлены отношения

User.cs

public int UserId { get; set; }
    public string FullName { get; set; }
    public virtual ICollection<GroupUser> GroupUsers { get; set; } = new List<GroupUser>();

GroupUser.cs

public class GroupUser
{
    public int UserId { get; set; }
    public User User { get; set; }
    public int GroupId { get; set; }
    public Group Group { get; set; }
}

Это другое отношение вэто тоже.Может ли это вызвать ошибку?

Мне нужно, чтобы группы не удалялись, так как они могли бы принадлежать другой статье.

РЕДАКТИРОВАТЬ 2

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<GroupUser>()
            .HasKey(e => new { e.UserId, e.GroupId }); 

        modelBuilder.Entity<GroupUser>()
            .HasOne(e => e.User)
            .WithMany(e => e.GroupUsers)
            .HasForeignKey(e => e.UserId)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<GroupUser>()
            .HasOne(e => e.Group)
            .WithMany(e => e.GroupUsers)
            .HasForeignKey(e => e.GroupId)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<ArticleGroup>()
            .HasKey(e => new { e.ArticleId, e.GroupId });

        modelBuilder.Entity<ArticleGroup>()
            .HasOne(e => e.Article)
            .WithMany(e => e.ArticleGroups)
            .HasForeignKey(e => e.ArticleId)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<ArticleGroup>()
            .HasOne(e => e.Group)
            .WithMany(e => e.ArticleGroups)
            .HasForeignKey(e => e.GroupId)
            .OnDelete(DeleteBehavior.Restrict);
}
...