My view submits data to the controller using Json objects which contains child objects.It allows users to add/remove/modify the relationship with child entities(authors,categories,LIbraryBookCopy). Users can only select authors and categories from list but can update/add LibraryBookCopy object.
This is my first MVC project and I have done this so far . Am I doing too much manipulation on the data? Is this the right way of doing this?
[HttpPost]
public ActionResult Edit(BookViewModel bookv)
{
bool found=false;
Mapper.CreateMap<AuthorViewModel, Author>();
Mapper.CreateMap<CategoryViewModel, Category>();
Mapper.CreateMap<LibraryBookCopyViewModel, LibraryBookCopy>();
List<Author> authors = Mapper.Map<List<AuthorViewModel>, List<Author>>(bookv.Authors.ToList());
List<Category> categories = Mapper.Map<List<CategoryViewModel>, List<Category>>(bookv.Categories.ToList());
bookv.Authors.Clear();
bookv.Categories.Clear();
Mapper.CreateMap< BookViewModel,Book>();
Book book = Mapper.Map<BookViewModel,Book>(bookv);
List<LibraryBookCopy> toBeDeletedLibraryBookCopies = new List<LibraryBookCopy>();
List<LibraryBookCopy> toBeAddedLibraryBookCopies = new List<LibraryBookCopy>();
List<LibraryBookCopy> toBeUpdatedLibraryBookCopies = new List<LibraryBookCopy>();
List<LibraryBookCopy> libraryBookCopiesFromDatabase = new List<LibraryBookCopy>();
db.Books.Attach(book);
//Assign categories to book
foreach (Category c in categories) { db.Categories.Attach(c); }
book.Categories.Clear();
foreach (Category c in categories) { book.Categories.Add(c); }
//Assign authors to book
foreach (Author a in authors) { db.Authors.Attach(a); }
book.Authors.Clear();
foreach (Author a in authors) {book.Authors.Add(a); }
if (bookv.LibraryBookCopies != null)
{
List<LibraryBookCopy> bookCopiesFromView = Mapper.Map<List<LibraryBookCopyViewModel>, List<LibraryBookCopy>>(bookv.LibraryBookCopies);
libraryBookCopiesFromDatabase = db.LibraryBookCopies.Where(lbc=>lbc.BookId==book.BookId).ToList();
foreach (LibraryBookCopy bc in libraryBookCopiesFromDatabase)
{
foreach (LibraryBookCopy bcv in bookCopiesFromView)
{
if ((bc.LibraryId == bcv.LibraryId) )
{
found = true;
toBeUpdatedLibraryBookCopies.Add(bcv);
break;
}
}
if (!found)
{
toBeDeletedLibraryBookCopies.Add(bc);
}
found = false;
}
//remove objects moved to toBeDelted
foreach (LibraryBookCopy lbc in toBeDeletedLibraryBookCopies )
{
libraryBookCopiesFromDatabase.Remove(lbc);
}
//NOW FIND NEW BOOK COPIES TO BE ADDED
foreach (LibraryBookCopy bcv in bookCopiesFromView)
{
if (libraryBookCopiesFromDatabase.Count == 0)
{
toBeAddedLibraryBookCopies.Add(bcv);
}
else
{
foreach (LibraryBookCopy bc in libraryBookCopiesFromDatabase)
{
if ((bc.LibraryId != bcv.LibraryId))
{
toBeAddedLibraryBookCopies.Add(bcv);
}
}
}
}
}
else
{
book.LibraryBookCopies.Clear();
}
//mark copies as deleted
foreach (LibraryBookCopy lbcv in toBeDeletedLibraryBookCopies)
{
// db.LibraryBookCopies.Attach(lbcv);
db.LibraryBookCopies.DeleteObject(lbcv);
}
//Add library ref to each libraryBookCopies object in Book
foreach (LibraryBookCopy lBC in toBeAddedLibraryBookCopies)
{
db.LibraryBookCopies.AddObject(lBC);
}
db.ObjectStateManager.ChangeObjectState(book, EntityState.Modified);
db.SaveChanges();
return RedirectToAction("Index");
}