Linq, лямбда-выражение - PullRequest
       1

Linq, лямбда-выражение

3 голосов
/ 23 октября 2011

У меня есть база данных с отношением «многие ко многим». И я пытаюсь с помощью lambda и linq удалить запись в таблице «многие ко многим».

У меня есть одна Ado-сущность с именем Book, а другая с именем Author. Книга содержит свойство навигации Authors, а Author содержит свойство Books.

Теперь я хочу удалить книгу из моей БД. Для этого мне нужно удалить его внешние ключи в AuthorBooks -таблице, однако это оказывается трудным.

Это мой синтаксис в то время:

var a = db.db.Authors.Select(c => db.db.Authors.Where(c.Books.Contains(book));

Это не принято Visual Studio, и я не знаю, как добраться туда, куда я хочу. Заранее спасибо!

Картинки с моих ошибок:


http://olofd.dyndns.org:8887/pic1.PNG


http://olofd.dyndns.org:8887/pic2.PNG


http://olofd.dyndns.org:8887/pic3.PNG

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Следующий код должен исправить это:

book = db.Books.Single(b => b.BookId == book.BookId);
 var bookCopies = db.BookCopies.Where(c => c.BookId == book.BookId).ToList();

 foreach (BookCopy c in bookCopies)
 {
     db.BookCopies.DeleteObject(c);
 }

 var authors = db.Authors.Include("Books").Where(author => author.Books.Any(b => b.BookId == book.BookId)).ToList();

 foreach (Author a in authors)
 {
     a.Books.Remove(book);
 }

 db.DeleteObject(book);
 db.SaveChanges();

Причина, по которой вы получили ошибку, заключалась в том, что вы не включили отношение Книги при загрузке авторов.Из-за этого вы перебрали коллекцию авторов, где у каждого автора было ноль книг.Удаление книги с помощью a.Books.Remove (книга) ничего не сделало.

Вы могли видеть, что это произошло, когда вы проверили db.ObjectStatemanger.Вы удаляете объекты, но в менеджере состояний ничего не появляется.

Вам также необходимо добавить ToList () к запросам.В противном случае вы будете удалять объекты из той же коллекции, что и итерируете, и это вызовет исключение.

2 голосов
/ 23 октября 2011

Кажется, вы указываете слишком много вещей слишком много раз. Я ожидаю, что это будет выглядеть примерно так:

var authors = db.Authors.Where(author => author.Books.Contains(book));

Если честно, я бы надеялся , что, когда вы удалили сущность, LINQ уже удалит для вас отношения внешнего ключа - вы уверены, что это не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...