C# 实体框架SQL删除对象ASP NET

C# 实体框架SQL删除对象ASP NET,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我正在制作一个图书馆网站,看在上帝的份上,我可以不删除任何图书 关系如下所示: 要删除这本书,我尝试过这样做: public void Delete(BOOK bookObj) { using (var db = new LibraryDBEntitiesAws()) { BOOK bookToRemove = db.BOOKs.Find(bookObj.ISBN); foreach (AUTHOR

我正在制作一个图书馆网站,看在上帝的份上,我可以不删除任何图书

关系如下所示:

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

 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语句与引用约束\FK\u BOOK\u AUTHOR\u BOOK\冲突。冲突发生在数据库\LibraryDB\表\dbo.BOOK\u AUTHOR\列“ISBN”中。\r\n该语句已终止。}


我已经试过几种方法来做到这一点。为什么不起作用

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

比如猜测你的表和键名,但希望你能理解

BOOK bookToRemove = db.BOOKs.Find(bookObj.ISBN);
db.BOOKAUTHORS.Remove(db.BOOKAUTHORS.Where(ba => ba.BookId == bookToRemove.Id));

出现此问题的原因是您试图删除的书籍的一个或多个作者链接到其他书籍对象

我假设您实际上只想删除您要删除的书籍是其链接到的唯一书籍的作者。否则,即使它允许你这么做,你最终可能会得到一本没有作者的书

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

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


        foreach (AUTHOR a in bookObj.AUTHORs) 
        {
            // Get the count of other books by the author
            var authBooks = db.BOOKS.Where(b => b.AUTHORs.Contains(a) 
                && b.ISBN != bookObj.ISBN).Count();
            // Check that the author does not have any books other 
            // than the one to be deleted
            if (authbooks != 0)
                bookToRemove.AUTHORs.Remove(a);
        }

        bookToRemove.CLASSIFICATION = null;


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

    }

}
问题在于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();
    }
}

这给了我同样的错误。在foreach中,我实际上并没有从数据库中删除所有作者,只是从Books authorlist中删除。哦,对不起,没有正确阅读-您似乎有一个名为Book_Author的桥接表?您必须首先从该行中删除相应的行!谢谢,这很有道理。问题是我无法访问Book_Authors。为什么您不能访问该表,但您可以访问Book one?似乎很奇怪…这给了我错误{无法创建'Repository.BOOK'类型的常量值。在此上下文中仅支持基元类型或枚举类型。}已更新。没有注意到一本书上可能有多个作者
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();
    }
}