实体框架SQL删除对象ASP NET

时间:2017-03-16 16:05:09

标签: c# sql-server entity-framework

我正在建立一个图书馆网站,我可以为了上帝的爱而不删除书籍对象。

关系如下:

Picture of relationships

要删除这本书,我试过这样做:

 public void Delete(BOOK bookObj)
    {
        using (var db = new LibraryDBEntitiesAws())
        {

            BOOK bookToRemove = db.BOOKs.Find(bookObj.ISBN);


            foreach (AUTHOR a in bookObj.AUTHORs) 
            {
                bookToRemove.AUTHORs.Remove(a);
            }

            bookToRemove.CLASSIFICATION = null;


            db.BOOKs.Remove(bookToRemove);
            db.SaveChanges();

        }

    } 

我一直收到错误

  

{“DELETE语句与REFERENCE约束冲突\”FK_BOOK_AUTHOR_BOOK \“。冲突发生在数据库\”LibraryDB \“,表\”dbo.BOOK_AUTHOR \“,列'ISBN'。\ r \ n该声明包含已被终止。“}

我尝试了几种方法来做到这一点。为什么不起作用?

3 个答案:

答案 0 :(得分:1)

foreach (AUTHOR a in bookObj.AUTHORs) 
{
   bookToRemove.AUTHORs.Remove(a); 
}

问题是 bookObj.AUTHORs 中的对象和 bookToRemove.AUTHORs 不是同一个对象。

您可以尝试以下方法吗?

public void Delete(BOOK bookObj)
{
    using (var db = new LibraryDBEntitiesAws())
    {
        BOOK bookToRemove = db.BOOKs
            .Include("AUTHORs")
            .FirstOrDefault(b => b.ISBN == bookObj.ISBN);

        var aids = bookToRemove.AUTHORs.Select(a => a.Aid).ToList();
        foreach (var aid in aids)
        {
            var authorToRemove = bookToRemove.AUTHORs.First(a => a.Aid == aid);
            bookToRemove.AUTHORs.Remove(authorToRemove);
        }

        db.BOOKs.Remove(bookToRemove);
        db.SaveChanges();
    }
}

答案 1 :(得分:0)

您有一个名为Book_Author的桥接表,它将书籍与作者联系起来......您首先必须删除此表中引用本书的所有条目(或在数据库中的外键上设置级联删除)。

这样的事情(猜测你的桌子和关键名称,但希望你能得到这个想法);

dagger.android.support

答案 2 :(得分:0)

问题正在发生,因为您尝试删除的isInactive() { this.inactiveClients = this.clients.filter(exitDate => !!exitDate); } 的一位或多位作者已链接到其他Book个对象。

我认为您实际上只想删除您要删除的图书是他们所链接的唯一图书的作者。否则,即使它允许你这样做,你最终也会得到没有作者的书。

Book