2011-11-01 1 views
2

EF4를 처음 사용하고 다 대다 관계의 레코드를 삽입하려고합니다.Entity Framework 4 - many-to-many 삽입

  • A (ID, 설명)
  • B (ID, 코드)
  • AB (원조, BID) < --A와 B의 관계

문제 : 나는 3 표를 얻었다 SaveChanges()를 호출하면 예외가 발생하고 B에 새 레코드를 삽입하려고합니다. 필자는 링크를 추가하기로되어 있습니다. 내 연구에서

var a = new A(){Description="Example"}; 

var b = context.B.Single(B => B.ID == paramID); 

a.B.Add(b); 

context.A.AddObject(a); 

context.SaveChanges() <---- here it throws the exception 

, 새로운 A와 기록하고 A와 B 사이의 링크를 생성하고이 오른쪽 AB 테이블에 저장해야 위의 코드 : 여기 내 코드는?

내가 뭔가를 잃어 버렸나요?

편집 :

이 내가지고있어 예외가 있습니다 :

, 테이블 'dbo.B' 'MIC'열에 NULL 값을 삽입 할 수 없습니다; 열이 널을 허용하지 않습니다. INSERT가 실패합니다. \ r \ n 명령문이 종료되었습니다.

참고로, 테이블 B에 새 레코드를 만들지 않기 위해 many-to-many 링크를 추가하려고하고 있습니다. 심지어 a.B를 비워 두려고 시도했지만 여전히 위에서 설명한 예외를 throw합니다.

+2

예외 유형 및 메시지가이 질문과 관련이있는 것으로 보입니다 ... – driis

답변

2

당신은 컬렉션에 B를 추가하기 전에 컨텍스트에 A를 부착 시도해 볼 수도 있습니다 :

var a = new A { Description = "Example" }; 
var b = context.B.Single(B => B.ID == paramID); 

context.A.AddObject(a); 
a.B.Add(b); 

context.SaveChanges(); 

불행하게도 지금이 테스트 할 수있는 기회가 없지만, 내 생각은 그 문맥에 A를 추가 할 때 EF는 B 컬렉션의 개체 상태를 Added으로 설정합니다. 이 경우 문제가 해결됩니다.

또는 당신은 둥근 다른 길을가는 시도 할 수 - B 목록에 A를 추가 :

var a = new A { Description = "Example" }; 
var b = context.B.Single(B => B.ID == paramID); 

b.A.Add(a); 

context.SaveChanges(); 

이 귀하의 경우 깨끗한 방법처럼 보인다.

+0

마지막 제안이 모두 해결되었습니다! – Mauro

+0

링크를 추가하기 전에 링크 테이블의 레코드가 이미 있는지 확인할 수 있습니다 (예 : Single to SingleOrDefault를 변경 한 다음 b가 null 인 경우에만 추가 ...). – AshesToAshes