Как удалить элемент в сущности «A» и удалить все другие элементы в сущности «B», которые связаны FK с сущностью «A» - PullRequest
0 голосов
/ 07 мая 2020

Я использую ASP. NET MVC для создания приложения для форумов. У меня есть сущность с именем «Сообщения» и сущность с именем «PostReplies».

В конкретном сообщении будет список ответов, которые связаны с помощью FK: 'Post_Id' в моей сущности 'PostReplies'.

Я хочу знать, как бы я go удалял сообщение, которое затем удаляло бы ответы, связанные с этим сообщением.

Я использовал Fluent API, чтобы попытаться решить эту проблему но я получаю это сообщение об ошибке:

Одна или несколько ошибок проверки были обнаружены во время создания модели:

"BookClub.Data.IdentityUserLogin:: EntityType 'IdentityUserLogin' не имеет> ключа Определите ключ для этого EntityType. BookClub.Data.IdentityUserRole:: EntityType 'IdentityUserRole' не имеет определенного ключа?>. Определите ключ для этого EntityType. IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' основан на типе 'Identity'UserLogins' IdentityUserRoles: EntityType: EntitySet «IdentityUserRoles» основан на> типе «IdentityUserRole», для которого не определены ключи. "

Я использую MVC ApplicationDbContext по умолчанию и поэтому в моей базе данных есть таблицы ApplicationUser.

Кто-нибудь знает, как исправить эту проблему?

POST ENTITY MODEL

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime Created { get; set; }

    public virtual Discussion Discussion { get; set; }
    public virtual ICollection<PostReply> Replies { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

POSTREPLY ENTITY MODEL

public class PostReply
{
    public int Id { get; set; }
    public string Content { get; set; }
    public DateTime Created { get; set; }

    public virtual Post Post { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

МЕТОД УДАЛЕНИЯ / ЛОГИН C

    public void DeletePost(Post post)
    { 

       var deletePost = _context.Post.FirstOrDefault(p => p.Id == id);

        if (deletePost != null)
        {

            _context.Post.Remove(deletePost);
            _context.SaveChanges();
        }

    }

ПОСТКОНТРОЛЛЕР

   [HttpGet]
    public ActionResult DeletePost(int id)
    {

        return View(_postService.GetPost(id));
    }

    [HttpPost]
    public ActionResult DeletePost(Post post)
    {
         var posts = new Post();

            _postService.DeletePost(id, post);


       return RedirectToAction("GetPostsByDiscussion","Discussion", 
         new { id = post.Id })

    }

Я использовал Fluent API и написал следующий код:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<PostReply>()
            .HasRequired(p => p.Post)
            .WithMany(p => p.Replies)
            .HasForeignKey(r => r.PostId)
            .WillCascadeOnDelete(false);

    }

1 Ответ

1 голос
/ 07 мая 2020

Вам необходимо добавить связь между сущностями в вашем DBContext

Это может быть Один-ко-многим, Один-к-одному, Многие-ко-многим

Вы можете найти подробную документацию здесь

Изменить:

Я использую MVC ApplicationDbContext по умолчанию и поэтому в моей базе данных есть таблицы ApplicationUser.

если вы наследуете ApplicationDbContext, вы должны вызвать метод base.OnModelCreating() в методе создания вашей модели.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<PostReply>()
        .HasRequired(p => p.Post)
        .WithMany(p => p.Replies)
        .HasForeignKey(r => r.PostId)
        .WillCascadeOnDelete(true);
}

И чтобы включить каскадное удаление, вы должны отправить истинный параметр, например .WillCascadeOnDelete(true)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...