2011-10-23 9 views
3

私は「多対多」の関係を持つデータベースを持っています。私はlambdaとlinqを使って多対多テーブルのエントリを削除しようとしています。Linq、ラムダ式

私はBookと呼ばれる1つのAdoエンティティと、Authorと呼ばれるもう1つのAdoエンティティを持っています。 ブックにはナビゲーションプロパティAuthorsAuthorが含まれており、プロパティーはBooksです。

今、自分のDBから本を削除します。これを行うには、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

+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

ああ!本当にありがとう!あなたのコードでは、1つの問題しか残されません。ブックコピーは引き続きローンで参照されます。だから私はローンを持っている本を削除することはできません。私はこのループを運のないアイデアと考えましたか?foreach(bookCopy bookcopy in bookCopies) { var loansWithBook = bookcopy.Loans.Where(loan => loan.BookCopyID == bookcopy.BookCopiesID); foreach(loansWithBookのloan e) { db.db.Loans.DeleteObject(e); } } –

+0

.ToList()を追加して動作しました。 foreachloopで。これにより、「コレクションが変更されました」という例外が削除されました。感謝万円! –

2

Iあまりにも多くのことを何度も指定しているようです。あなたにそれはdoesnの確信している - 私はあなたがエンティティを削除したときに、LINQは、すでにあなたのための外部キー関係を削除することを希望なり、

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

は正直に言うと:私はそれのようなものを見て期待しますt?

+0

ありがとう!偉大な作品が、私はこの後に本を削除する方法。私はforeachでループしていますが、指定した本を削除するにはどうすればいいですか?申し訳ありませんが私の質問は、最初に、これは私がこれからしたいことですが、それは動作していないことを尋ねていない:foreach(著者の著者) { a.Books.Remove(book); } –

+0

いいえ、関係を削除しません。これは私にこの例外を与えます:操作は失敗しました:1つまたは複数の外部キーのプロパティがnullにできないため、関係を変更できませんでした。リレーションシップが変更されると、関連する外部キー・プロパティーはNULL値に設定されます。外部キーがNULL値をサポートしていない場合は、新しい関係を定義する必要があります。また、外部キー・プロパティーに別の非NULL値を割り当てる必要があります。 –

+0

@ ObjectiveCoder:「これは私にこの例外を与えます」と言うとき、何をしたら?あなたはちょうど本自体を削除しようとするとき?生成されたLINQで関係がどのように見えるか、また試した結果や結果を示すことができれば、それは便利です。 (コメントを追加するのではなく、これを質問に編集してください) –