DbUpdate尝试从数据库中删除条目时发生异常

时间:2017-07-15 17:49:22

标签: c# asp.net-mvc entity-framework ef-fluent-api

所以,问题是,我尝试删除 DeletePost操作中名为发布的条目,只需搜索并从数据库中删除强>

public ActionResult DeletePost(int Id)
    {
        var postToDelete = ApplicationDbContext.Posts.Find(Id);
        postToDelete.Author = null;            
        ApplicationDbContext.Posts.Remove(postToDelete);
        ApplicationDbContext.SaveChanges();
        return RedirectToAction("Index");
    }  

内部例外说:

  

SqlException:DELETE语句与REFERENCE约束冲突" FK_dbo.AspNetUsers_dbo.Posts_Post_Id"。冲突发生在数据库" aspnet-Destiny-20170709034743",table" dbo.AspNetUsers",column' Post_Id'。

我对这些问题没有足够的经验,但这是我之前写的很多用于级联删除的FluentAPI代码。

modelBuilder
.Entity<Post>()
.HasRequired(x => x.Author)
.WithMany(x => x.Posts)
.HasForeignKey(x => x.AuthorId)
.WillCascadeOnDelete(true);

而且我想我必须为 PostId 做同样的事情,但我不知道如何做到这一点。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我认为您的数据库架构是错误的。数据库返回的错误表明您正在尝试删除帖子,但此帖子由AspNetUsers表中的外键引用(列Post_id)。您确定要在AspNetUsers表中使用Post_Id列吗?它似乎没有意义。它应该以另一种方式设计 - 存储所有帖子的表应该用外键引用用户,即

  

列User_Id,它引用AspNetUsers表中的主键列

答案 1 :(得分:0)

好的,经过一些研究后我意识到在删除对象之前我必须删除任何可能的引用。所以这是我解决这个问题的方法。

public ActionResult DeletePost(int Id)
    {
        var allUsers = ApplicationDbContext.Users.ToList();
        var postToDelete = ApplicationDbContext.Posts.Single(c => c.Id == Id);
        foreach(var item in allUsers)
        {
            if (postToDelete.Subscribers.Contains(item))
                postToDelete.Subscribers.Remove(item);
        }
        ApplicationDbContext.Posts.Remove(postToDelete);
        ApplicationDbContext.SaveChanges();
        return RedirectToAction("Index");
    }