2016-06-06 2 views
-1

테이블 크기가 있으며, Linq에서 SQL로 생성 한 해당 객체에 GetHashCode 및 Equals가 오버로드되었습니다.Linq to SQL : 연속적으로 두 객체를 삽입 할 수 없습니다.

나는 다음과 같은 코드를 실행 오전 : 세 번째 SubmitChanges에

Size s = new Size(); 
data_context.Sizes.InsertOnSubmit(s); 
data_context.SubmitChanges(); 
s = new Size 
{ 
    Diameter=1 
}; 
data_context.Sizes.InsertOnSubmit(s); 
data_context.SubmitChanges(); 
s = new Size 
{ 
    Diameter=1 
}; 
data_context.Sizes.InsertOnSubmit(s); 
data_context.SubmitChanges(); 

를, 내가 메시지와 함께 InvalidOperationException이 얻을

. "이미 존재하는 개체를 추가 할 수 없습니다"

프로그램을 다시 실행하면 처음 두 개는 다시 추가 할 수 있지만 세 번째는 추가 할 수 없습니다. 나는 어떤 일이 일어나고 있는지, 누군가 포인터를 줄 수 있는지 전혀 모른다.

Size.Equals 또는 Size.GetHashCode 만 재정의하면이 문제가 발생하지 않지만 두 가지 모두를 재정의하면 수행됩니다.

같음과를 GetHashCode 재정은 다음과 같다 (그러나 정말 값 의미를 구현하는 방법의 모든 종류가 같은 동작이 발생할) :

public override bool Equals(Object obj) 
{ 
    if (obj == null) 
    { 
     return false; 
    } 
    Size p = obj as Size; 
    if ((System.Object)p == null) 
    { 
     return false; 
    } 
    return p.Diameter == Diameter; 
} 
public override int GetHashCode() 
{ 
    return Diameter?.GetHashCode()??0; 
} 

답변

2

당신은 말했다 :

내가 GetHashCode를 오버로드 Linq가 SQL로 생성 한 해당 객체에 대해 같음.

같은 속성을 가진 두 개의 Size 엔티티가 동일하게 간주되도록 오버로드 한 경우 예상대로 작동합니다. LINQ to SQL은 평등 검사를 사용하여 두 개체가 동일한 레코드를 참조하여 항목을 동기화 상태로 유지하는지 확인합니다.

EqualsGetHashCode을 처음으로 대체 했습니까? 이러한 대체를 제거하기 만하면 유사한 Size 개 개체를 삽입하려는 경우이 문제를 피할 수 있습니다.

+0

좋아,이 문서화 된 곳을 알려주시겠습니까? 또한 기존 항목의 이미 "중복"된 첫 번째 항목과 두 번째 항목을 삽입 할 수있는 이유를 설명 할 수 있습니까? –

+0

Size.Equals를 오버라이드 한 것은 다른 곳에서 나에게 편리하기 때문에 Size.GetHashCode를 오버라이드했다. 나는 그것을 제거 할 수는 있지만 실제로 일어나는 일을 이해하고 싶습니다 ... –

+0

@Ernest_Galbrun - 아마도 여러분은 여러분의 질문에 'Equals'와'GetHashCode' 구현을 추가해야 할 것입니다. 사람들이 대답하는 데 도움이 될 수 있습니다. 또한 첫 번째 예에서는 'Diameter'값을 설정하지 않습니다. 기본값은 무엇입니까? 그 수업을 보여줄 수 있습니까? –

관련 문제