2012-02-22 3 views
0

Visual Studio 데이터베이스 다이어그램 편집기에서 데이터베이스 디자인을 작성하고 그에 대한 모든 테이블을 작성했습니다. Linq to SQL 클래스를 만들고 테이블을 추가하여 각 테이블에 대한 개체를 만들었습니다. 데이터베이스에 새 항목을 삽입하려고 할 때 문제가 발생합니다.SQL에 Linq를 사용하여 관계형 데이터를 삽입하면 중복 입력 오류가 발생합니다.

예 :

두 테이블 인 아티스트 및 앨범이 있다고 가정 해 보겠습니다. 단일 아티스트가 여러 앨범 (일대 다)을 가질 수 있습니다. 앨범에는 아티스트 테이블의 아티스트 ID PK에 대한 FK 인 아티스트 ID 입력란이 있습니다. ID는 데이터베이스에 의해 자동으로 생성되는 GUID입니다.

이제 내 코드에서 새 앨범 객체 (myAlbum)를 만들고 해당 아티스트 객체를 이미 데이터베이스 (myArtist)에있는 아티스트로 설정합니다.

나는 이런 식으로 뭔가 할 경우. 내가 말하는 SQLEXCEPTION을 받고 결국

DatabaseDataContext context = new DatabaseDataContext(); 
context.Albums.InsertOnSubmit(myAlbum); 
context.SubmitChanges(); 

:. "PRIMARY KEY 제약 조건 'PK_Artist'의 위반이 객체에 'dbo.Artist을'중복 키를 삽입 할 수 없습니다를 성명서가 종료되었습니다. "

myAlbum.Artist를 이미 데이터베이스에있는 아티스트와 비교하면 Linq은 평등하다고 말합니다. 따라서 동일한 개체라는 것을 알고 있습니다.

어떻게하면 아티스트를 다시 삽입하지 않고도 새 앨범 객체를 삽입하고 기존 아티스트와 데이터베이스에 연결할 수 있습니까?

+0

pk_Artist 열 데이터 형식이란 무엇입니까? –

+0

또한 GUID입니다. – nguyer

+0

아티스트를 설정 한 코드를 게시 할 수 있습니까? – Paddy

답변

0

중복 기본 키가 GUID.Empty 일 수 있다고 생각합니다. 내 이해가 정확하다면.

이 문제에 대한 해결책을 생각해 보겠습니다.

pk_artist 열의 기본값을 newid()으로 설정하십시오. 그러면 기본 Kerr이 자동으로 생성됩니다.

또는

명시 적 엔티티에 기본 키를 지정하십시오.

myAlbum.Pk_Artist = GUID.NewGiud(); 
context.Albums.InsertOnSubmit(myAlbum); 

희망이 도움

+0

사실 pk_arti의 기본값은 이미 newid()로 설정되어 있고 DB에 의해 자동으로 생성되도록 설정되어 있습니다. – nguyer

0

은 분명히, 당신은 다른 데이터 컨텍스트 인스턴스와 처가 객체와 앨범의 Artist 속성을 설정합니다. 따라서 새 DatabaseDataContext은 아티스트를 삽입해야한다고 생각합니다.

Album.ArtistId (아티스트 개체 아님)를 설정하거나 동일한 데이터 컨텍스트에서 아티스트를 가져 와서 해당 앨범 컬렉션에 앨범을 추가 할 수 있습니다.

그런데 using (var context = new DatabaseDataContext()) { ... }이 좋습니다.

+0

아! 나는 네가 여기서 뭔가있는 것 같아. 데이터 컨텍스트 내에서 아티스트 객체를 만들지 않았다는 점에서 맞습니다. 이것은 내 테이블의 일부분입니다 (단순함을 위해). 사실, 나는 데이터베이스에 삽입하기 전에 이러한 방식으로 큰 객체 관계를 구축합니다. Linq가 이미 데이터베이스에있는 객체를 "일치"시킬 수있는 방법이 있습니까? – nguyer

+0

거의 없습니다. [Attach method] (http://msdn.microsoft.com/en-us/library/bb548978.aspx)를 참조하십시오. 귀하의 시나리오가 여기에 설명 된 조건과 일치하지 않는다고 생각합니다. 하나의 DataContext의 범위 내에서 모든 작업을 수행하거나 ID로 작업하는 것이 좋습니다. –

+0

확인. 분명히 그 때해야 할 더 많은 연구가 있습니다. 도와 주셔서 감사합니다! 나는 네가 나를 올바른 길로 인도했다고 생각한다! – nguyer

0

먼저 중복 된 기본 키를 해결해야하며 기본 키 UNIQUEIDENTIFIER(newid())의 기본 키를 사용하여 기본 테이블을 만들었습니다.

다음 테이블을 Linq To SQL 클래스 프로젝트로 드래그하면 제외하고 원하는 모든 항목으로 테이블 클래스가 만들어집니다. 기본 키 열은 Auto Generate Values이 true로 설정되어 있어야하지만 그렇지 않습니다.열 데이터 형식이 UNIQUEIDENTIFIER 인 경우 기본적으로 false입니다. 그런 다음 MS SQL에서 열을 삭제하고 데이터 형식을 INT으로 다시 작성하여 Linq to SQL 클래스로 끌어 와서 열 속성 Auto Generate Values을 true로 설정했습니다.

따라서 UNIQUEIDENTIFIER을 사용하는 경우 수동으로 Auto Generate Values 속성을 true로 설정해야합니다.

관련 문제