2011-10-23 9 views
3

나는 -relationship "많은 많은"기호가있는 데이터베이스를 가지고있다. 그리고 lambda와 linq를 사용하여 Many-to-Many 테이블의 항목을 제거하려고합니다. Linq에, 람다 식

나는 하나 아도 - 엔티티 Book라고하고 또 다른 Author을했다. 예약 AuthorsAuthor이 재산 Books을 포함하는 탐색 속성이 포함되어 있습니다.

지금 내 DB에서 책을 제거 할. 이렇게하려면 AuthorBooks 표에있는 외래 키를 제거해야하지만 어렵습니다.

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

이것은 비주얼 스튜디오에 의해 허용되지 않고, 내가 원하는 곳에 도착하는 방법을 모른다 :

이 시간에 내 구문입니다. 미리 감사드립니다. 내 오류에서

사진 :


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는 여전히 Loans에서 언급됩니다. 그래서 대출이있는 책은 삭제할 수 없습니다. 나는이 루프를 행운을 불어 넣지 않으려 고 노력했다 : foreach (bookCopy bookcopy in bookCopies) { var loansWithBook = bookcopy.Loans.Where (loan => loan.BookCopyID == bookcopy.BookCopiesID); foreach (loansWithBook의 대출 e) { db.db.Loans.DeleteObject (e); } } –

+0

.ToList()를 추가하여 작동 시켰습니다. foreachloop에서. 이렇게하면 "컬렉션이 수정되었습니다"예외가 삭제되었습니다. 대단히 감사합니다! –

2

I 너무 많은 것을 너무 많이 지정하고있는 것처럼 보입니다. 당신은 '아무튼 확신 - 난 당신이 개체를 삭제하면, LINQ가 이미 당신을 위해 외래 키 관계를 제거하는 것이 희망 것,

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

는 솔직히 말해서 : 나는 뭔가를보고 기대 티?

+0

감사합니다. 그 위대한 작품이지만 어떻게이 후에 책을 제거 할 수 있습니다. foreach를 사용하여 반복하지만 특정 책을 제거하려면 어떻게해야합니까? 미안 해요 내 질문에 처음에,이 일을 내가 원하는 다음 일을 요구하지 않았다, 그것은 작동하지 않습니다 : foreach (저자의 저자) { a.Books.Remove (book); } –

+0

아니요, 관계를 제거하지 않습니다.그것은 저에게이 예외를 제공합니다 : 작업 실패 : 하나 이상의 foreign-key 속성이 nullable이 아니기 때문에 관계를 변경할 수 없습니다. 관계가 변경되면 관련 외래 키 등록 정보는 널 (NULL) 값으로 설정됩니다. 외부 키가 널값을 지원하지 않으면, 새 관계가 정의되어야하고, 외부 키 등록 정보에 널이 아닌 다른 값이 지정되어야합니다. 그렇지 않으면 관련이없는 오브젝트가 h 제되어야합니다. –

+0

@ ObjectiveCoder : "이 예외가 생깁니다"라고 말할 때 - 무엇을 할 때? 책 자체를 제거하려고 할 때? 생성 된 LINQ에서 관계가 어떻게 보이는지, 그리고 시도한 결과와 결과를 보여줄 수 있다면 유용 할 것입니다. (덧글을 달기보다는 질문을 편집하십시오.) –