Последние несколько дней я пытаюсь правильно обновить свои объекты POCO. Точнее, это коллекции отношений «многие ко многим».
У меня есть три таблицы базы данных:
Автор - 1..n - AuthorBooks - n..1 - Книги.
Переводится на два объекта POCO:
Объект Author с коллекцией Books и объект Book с коллекцией Author .
Case
Когда у меня есть один активный DbContext, извлекаем сущность Book, добавляем Author и вызываем SaveChanges (), изменения правильно отправляются в базу данных. Пока все хорошо.
Однако у меня есть настольное приложение с ограниченным временем жизни DbContext, как показано в фрагментах кода ниже.
public Book GetBook(int id)
{
using (var context = new LibariesContext())
{
return context.Books
.Include(b => b.Authors)
.AsNoTracking()
.Single(b => b.BookId == id);
}
}
public Author GetAuthor(int id)
{
using (var context = new LibariesContext())
{
return context.Authors
.AsNoTracking()
.Single(a => a.AuthorId == id);
}
}
Упрощенный пример различных моих методов бизнес-логики, объединяет их:
public void BusinessLogicMethods()
{
Book book = GetBook(id: 1);
Author author = GetAuthor(id: 1);
book.Name = "New book title";
book.Authors.Add(author);
SaveBook(book);
}
public void SaveBook(Book book)
{
using (var context = new LibariesContext())
{
context.Entry(book).State = System.Data.EntityState.Modified;
context.SaveChanges();
}
}
К сожалению, единственное, что здесь действительно сохраняется, это название книги. Новый автор не был сохранен, и не было брошено исключение.
Вопросы
- Какой лучший способ сохранить коллекцию отсоединенного объекта?
- Есть ли какое-нибудь решение этой проблемы?