//public ActionResult Edit([Bind(Include = "BookID,AuthorID,MainAuthorID,MainSubjectID,SubjectID,Title,AlternativeTitle,PublisherID,CreationDate,InitialPrintedYear,ActualPrintYear,CategoryID,Language,Material,Read,Pages,ISBN,Website,CoverLink,Rating,CodeWithinSerie,Condition,ReviewNote,Location,Serie")] Book book)
        public ActionResult Edit(BookViewModel bookViewModel)
        {
            if (ModelState.IsValid)
            {
                var bookToUpdate = _db.Query <Book>()
                                   .Include(i => i.Authors)
                                   .Include(i => i.Subjects).First(i => i.BookID == bookViewModel.Book.BookID);

                if (TryUpdateModel(bookToUpdate, "Book"))
                {
                    // Update references to author (Add new/Remove old)
                    var newAuthors = _db.Query <Author>().Where(
                        m => bookViewModel.SelectedAuthors.Contains(m.AuthorID)).ToList();
                    var updatedAuthors = new HashSet <int>(bookViewModel.SelectedAuthors);
                    foreach (Author author in _db.Query <Author>())
                    {
                        if (!updatedAuthors.Contains(author.AuthorID))
                        {
                            bookToUpdate.Authors.Remove(author);
                        }
                        else
                        {
                            bookToUpdate.Authors.Add(author);
                        }
                    }

                    // Update references to subjects (Add new/Remove old)
                    var newSubjects = _db.Query <Subject>().Where(
                        s => bookViewModel.SelectedSubjects.Contains(s.SubjectID)).ToList();
                    var updatedSubjects = new HashSet <int>(bookViewModel.SelectedSubjects);

                    foreach (Subject sub in _db.Query <Subject>())
                    {
                        if (!updatedSubjects.Contains(sub.SubjectID))
                        {
                            bookToUpdate.Subjects.Remove(sub);
                        }
                        else
                        {
                            bookToUpdate.Subjects.Add(sub);
                        }
                    }

                    _db.SetState(bookToUpdate, EntityState.Modified);
                    _db.SaveChanges();
                }

                return(RedirectToAction("Index"));
            }

            PopulateCategoryDropDownList(bookViewModel.Book.CategoryID);
            PopulatePublishersDropDownList(bookViewModel.Book.PublisherID);

            return(View(bookViewModel));
        }