У меня есть 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);
}