2011-10-23 338 views
3

我有一個「多對多」關係的數據庫。我試圖用lambda和linq刪除多對多表中的條目。Linq,lambda表達式

我有一個名爲Book的實體,另一個名爲Author。 本書包含導航屬性AuthorsAuthor包含屬性Books

現在我想從我的數據庫中刪除一本書。要做到這一點,我必須在AuthorBooks -table中刪除它的外鍵,然而這證明是困難的。

這是我的語法在時間:

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

+0

出於好奇,爲什麼不是'Book','Author','BookAuthor'模型? (加入獨立表)? –

回答

2

下面的代碼應該修復它:

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()。另外,你會從迭代中刪除同一個集合中的實體,這會拋出異常。

+0

啊!謝謝一堆!有了你的代碼,我只剩下一個問題。 Bookcopies仍然被稱爲貸款。所以我不能刪除一本有貸款的書。我試圖添加這個循環,沒有運氣,任何想法?:foreach(BookCopy bookcopyCopyBook) { var loansWithBook = bookcopy.Loans.Where(loan => loan.BookCopyID == bookcopy.BookCopiesID); foreach(貸款與借書貸款) { db.db.Loans.DeleteObject(e); } } –

+0

通過添加.ToList();在foreachloop。這刪除了「收集已修改」異常。太感謝了! –

2

我你似乎太多次指定了太多的東西。我希望它看起來像:

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

說實話,我也希望,當你刪除的實體,LINQ將已經刪除的外鍵關係爲你 - 你確定它不」 T'

+0

謝謝!這很好用,但是如何在這之後刪除這本書。我試圖用foreach循環它,但是如何刪除指定的書。對不起,我的問題並沒有問起初,這是我想在此之後做的,但它不工作:foreach(作者在作者中) { a.Books.Remove(book); } –

+0

不,它不會刪除關係。它給了我這個例外:操作失敗:由於一個或多個外鍵屬性是不可空的,所以無法更改關係。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。 –

+0

@ObjectiveCoder:當你說「它給我這個例外」 - 當你做什麼?當你只是試圖刪除書本身?如果您可以向我們展示生成的LINQ中的關係,以及您嘗試過的結果和結果,那將會很有用。 (編輯這個問題,而不是添加評論。) –