Невозможно удалить авторов, которые имеют сообщения - PullRequest
0 голосов
/ 30 января 2019

В настоящее время я работаю над приложением блога и наткнулся на следующую проблему.

Я могу удалить авторов, у которых есть 0 блогов, но НЕ могу удалить авторов, у которых есть блоги.

Мой метод удаления HttpPost в AuthorController

    [HttpPost, ActionName("Delete")]
    public IActionResult DeleteConfirmed(int id)
    {
        if (ModelState.IsValid) {
            try {
                Author author = _authorRepository.GetById(id);
                _authorRepository.Remove(author);
                _authorRepository.SaveChanges();
                TempData["Success"] = $"{author.Firstname} {author.Lastname} has been successfully deleted!";
                return RedirectToAction(nameof(Index));
            }
            catch (Exception ex) {
                ModelState.AddModelError("", ex.Message);
            }
        }
        Author author2 = _authorRepository.GetById(id);
        ViewData["Name"] = $"{author2.Firstname} {author2.Lastname}";
        return View(nameof(Delete));
    }

Мое сопоставление конфигурации автора

public class AuthorConfiguration : IEntityTypeConfiguration<Author>
{
    public void Configure(EntityTypeBuilder<Author> builder)
    {
        builder.ToTable("Author");
        builder.HasKey(a => a.AuthorId);
        builder.Property(a => a.Firstname).HasMaxLength(40).IsRequired();
        builder.Property(a => a.Lastname).HasMaxLength(40).IsRequired();
        builder.HasMany(a => a.Posts)
            .WithOne()
            .IsRequired()
            .OnDelete(DeleteBehavior.Cascade);
    }
}

Модель автора

public class Author
{
    public int AuthorId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public ICollection<Post> Posts { get; set; }
    public int NrOfPosts => Posts.Count;

    protected Author()
    {
        Posts = new List<Post>();
    }

    public Author(string firstname, string lastname) : this()
    {
        Firstname = firstname;
        Lastname = lastname;
    }

    public void AddPost(Post post)
    {
        if (Posts.FirstOrDefault(p => p.PostId == post.PostId) == null) {
            Posts.Add(post);
        }
    }

    public void RemovePost(Post post)
    {
        Posts.Remove(post);
    }
}

Модель сообщения

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime Date { get; set; }
    public Category Category { get; set; }
    public ICollection<PostTag> Tags { get; set; }

    protected Post()
    {
        Tags = new List<PostTag>();
    }

    public Post(string title, string content, Category category) : this()
    {
        Title = title;
        Content = content;
        Date = DateTime.Now;
        Category = category;
    }

    public void AddTag(Tag tag)
    {
        if (FindTag(tag.Name) == null) {
            Tags.Add(new PostTag(this, tag));
        }
    }

    public void RemoveTag(Tag tag)
    {
        PostTag postTag = Tags.FirstOrDefault(pt => pt.Tag == tag);
        Tags.Remove(postTag);

    }

    public Tag FindTag(string name)
    {
        PostTag postTag = Tags.FirstOrDefault(pt => pt.Tag.Name == name);
        return postTag?.Tag;
    }
}

Чего мне не хватает, чтобы удалить авторов, у которых действительно есть сообщения?

Заранее спасибо

1 Ответ

0 голосов
/ 30 января 2019

Я предполагаю, что вы делаете модель сначала Entity Framework.Если это так, вы, скорее всего, имеете ограничение внешнего ключа в вашей базовой таблице Post.Попробуйте также удалить все сообщения.Например,

    if (ModelState.IsValid) {
        try {
            Author author = _authorRepository.GetById(id);
            var postIds = author.Posts.Select(post => post.Id);

            // Loop through posts and remove
            foreach (var postId in postIds) {
                var post = _postRepository.GetById(postIds);
                _postRepository.Remove(post);
            }
            // Done with posts

            _authorRepository.Remove(author);
            _authorRepository.SaveChanges();
            TempData["Success"] = $"{author.Firstname} {author.Lastname} has been successfully deleted!";
            return RedirectToAction(nameof(Index));
        }
        catch (Exception ex) {
            ModelState.AddModelError("", ex.Message);
        }

Надеюсь, это сработает, или вы получите рабочий ответ.По сути, это звучит так, как будто ограничение внешнего ключа сбивает вас с толку.

...