2010-01-11 4 views
8

이 이상한 오류가 발생했습니다 Cannot add an entity with a key that is already in use 하지만 그 오류에 대해 매우 짜증스러운 점은 사용자가 아무런 정보도 얻지 못합니다 - 누구입니까? 뭐? 어떤 테이블? 이 오류의 원인은 무엇입니까? 당신이 .Submit()이미 사용중인 키가있는 엔티티를 추가 할 수 없음

전에 LINQ 개체에 많은 작업을 할 경우

필사적으로 확실히이 오류의 원인을 확인할 수있는 방법이 있는가, 그것을 결정하기 위해 복잡 할 것인가?

답변

0

Table.Attach()를 수행하는 것처럼 들리며 첨부하려는 엔터티에 이미 L2S가 추적중인 키 값이 있습니다. 이것은 물리적 데이터베이스의 중복 키와 아무 관련이 없습니다.

+2

테이블에 거친 동작이 없습니다 (연결, 분리). 그러나 여전히이 예외가 던져진 이유를 여전히 모호합니다. 예외에 대한 자세한 정보가 있으면 어떤 코드를 수정해야하는지 알 수 있습니다. – igor

10

이 오류는 일반적으로 외래 키 관계로 외래 키 레코드가있는 MetaTable에 새 레코드를 만들 때 발생합니다.

예를 들어 연락처 테이블과 주소 테이블이 있고 각 연락처가 여러 개의 주소를 보유 할 수 있다고 가정 해 보겠습니다. 새 연락처 레코드를 만들고 기존 주소 레코드를 새 연락처에 수동으로 연결하려고하면 오류가 발생합니다.

전달 된 주소 ID는 기존 주소 기록을 나타낸다는 것을 가정 할 때,이 작동하지 않습니다

public class Contact 
{ 
    public int Contact_ID { get; set; } 
    public string Name { get; set; } 
    public Address ContactAddress { get; set; } 
    public string Phone { get; set; } 
} 

public class Address 
{ 
    public int Address_ID { get; set; } 
    public string Street { get; set; } 
    public string CityState { get; set; } 
    public string ZIP { get; set; } 
} 

public void CreateNewContact(int addressID) 
{ 
    Contact contact = new Contact(); 

    contact.Name = "Joe Blough"; 
    contact.ContactAddress.Address_ID = addressID; 
    contact.Phone = "(555) 123-4567"; 

    DataContact.SubmitChanges(); 
} 

가 역사적으로는, SQL 개발자가 훈련

그냥 일어날 수있는 마법의 순서 ID 값을 전달합니다. LINQ-to-SQL을 사용하면 데이터베이스 작업이 추상화되므로 LINQ 엔진이 ChangeSet의 필요한 변경 사항을 제대로 반영 할 수 있도록 전체 개체를 전달해야합니다. 위의 예에서 LINQ 엔진은 SubmitChanges가 만들어 졌을 때 작업 할 필요가 없으며 외래 키 관계로 설정된 계약을 준수해야하므로 새 주소 레코드를 만들 것을 요구한다고 가정합니다. 전달 된 ID 값을 사용하여 빈 주소 레코드를 만듭니다. 해당 ID 값이 이미 데이터 테이블에 있고 ChangeSet이 주소 델타를 업데이트로 플래그 지정하지 않았기 때문에 오류가 발생합니다. 기존의 하나로

contact.ContactAddress = DataContext.Addresses.Where(a => a.Address_ID == addressID).Single(); 

는 이제 LINQ 엔진이 제대로 들어오는 주소 기록을 신고 할 수 있고 그것을 다시 시도하지 :

수정 프로그램뿐만 아니라 ID 값, 전체 레코드에 전달하는 것입니다.

1

당신이 Attach(), Remove(), Add() 또는 DeleteOnSubmit()하려고 열 수 있음, 기본 키이며, 추가하거나 다시 같은 가치를 부여하기 위해 노력하고 있습니다.

또한 다른 방법으로 기본 키나 외래 키 값 열에 액세스 할 수 있으며 위 방법을 호출 할 때 아직 닫히지 않았습니다. 이러한 방법 Attach(), Remove(), Add() 또는 DeleteOnSubmit()에 위

, 다시 데이터 컨텍스트의 새로운 인스턴스를 생성하고 실행 해보십시오.

0

위의 대답 중 하나에서 설명한 것처럼이 오류는 주 ID 키 필드에 반복되는 값이있는 레코드를 테이블에 삽입하려고 할 가능성이 큽니다. 다른 기본 키를 선택/생성하여 문제를 해결할 수 있습니다.

관련 문제