테이블 크기가 있으며, 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;
}
좋아,이 문서화 된 곳을 알려주시겠습니까? 또한 기존 항목의 이미 "중복"된 첫 번째 항목과 두 번째 항목을 삽입 할 수있는 이유를 설명 할 수 있습니까? –
Size.Equals를 오버라이드 한 것은 다른 곳에서 나에게 편리하기 때문에 Size.GetHashCode를 오버라이드했다. 나는 그것을 제거 할 수는 있지만 실제로 일어나는 일을 이해하고 싶습니다 ... –
@Ernest_Galbrun - 아마도 여러분은 여러분의 질문에 'Equals'와'GetHashCode' 구현을 추가해야 할 것입니다. 사람들이 대답하는 데 도움이 될 수 있습니다. 또한 첫 번째 예에서는 'Diameter'값을 설정하지 않습니다. 기본값은 무엇입니까? 그 수업을 보여줄 수 있습니까? –