2 回答
TA贡献2003条经验 获得超2个赞
终于成功了!在下面,您可以看到与原始代码的不同之处。
PS也许您知道Remove方法更好的算法,如果可以在注释中键入它,那么我将更改答案。
BookRepository:
public Book Find(int id)
{
Book searchedBook = db.Books
.Include(b => b.BookAuthors)
.ThenInclude(b => b.Author)
.SingleOrDefault(b => b.BookId == id);
return searchedBook;
}
BookService:
public void UpdateObject(BookViewModel viewModel)
{
Book parsedBook = Mapper.Map<BookViewModel, Book>(viewModel);
//Book viewModelBook = parseBook;
var book = db.Books.Find(viewModel.BookId);
book.BookId = parsedBook.BookId;
book.BookName = parsedBook.BookName;
book.Genre = parsedBook.Genre;
book.Pages = parsedBook.Pages;
book.Publisher = parsedBook.Publisher;
UpdateAssociatedObject(book, parsedBook);
}
public void UpdateAssociatedObject(Book bookToUpdate, Book viewModelBook)
{
AddUpdatedAuthors(bookToUpdate, viewModelBook);
RemoveUpdatedAuthors(bookToUpdate, viewModelBook);
db.SaveChanges();
}
private void AddUpdatedAuthors(Book bookToUpdate, Book viewModelBook)
{
foreach (var authors in viewModelBook.BookAuthors)
{
var searchBookAuthor = bookToUpdate.BookAuthors.Find(b => b.AuthorId == authors.AuthorId);
if (searchBookAuthor == null)
{
bookToUpdate.BookAuthors.Add(authors);
}
}
}
private void RemoveUpdatedAuthors(Book bookToUpdate, Book viewModelBook)
{
int countOfAuthors = bookToUpdate.BookAuthors.Count;
for (int i = 0; i < countOfAuthors; i++)
{
BookAuthor searchBookAuthor = null;
foreach (var viewModelAuthors in viewModelBook.BookAuthors)
{
if (viewModelAuthors.AuthorId == bookToUpdate.BookAuthors[i].AuthorId)
{
searchBookAuthor = viewModelAuthors;
}
}
if (searchBookAuthor == null)
{
bookToUpdate.BookAuthors.Remove(bookToUpdate.BookAuthors[i]);
i--;
countOfAuthors--;
}
}
}
TA贡献1844条经验 获得超8个赞
该问题出现在db.SaveChanges()中。您在相同的上下文中多次调用db.SaveChanges
db.SaveChanges(); UpdateAssociatedObject(book, viewModelBook);
然后UpdateAssociatedObject(book, viewModelBook);
尝试删除一个db.SaveChanges()。
- 2 回答
- 0 关注
- 359 浏览
添加回答
举报