我有一个表格大小,我在Linq to SQL生成的相应对象上重载了GetHashCode和Equals。
我正在执行以下代码:
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();
在第三个SubmitChanges上,我收到带有消息
的InvalidOperationException“无法添加已存在的实体。”
如果我重新运行程序,我可以再添加前两个但不是第三个。我不知道发生了什么,有人可以给我一个指针吗?
如果我只覆盖Size.Equals或Size.GetHashCode,则不会出现此问题,但是当我覆盖它们时它会发生。
Equals和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;
}
答案 0 :(得分:2)
你说:
我在Linq to SQL生成的相应对象上重载了GetHashCode和Equals。
如果你重载那些具有相同属性的两个Size
实体被认为是相等的,那么这是按预期工作的; LINQ to SQL使用相等性检查来确定两个对象是否引用相同的记录以保持同步。
为什么首先覆盖Equals
和GetHashCode
?如果您希望能够插入类似的Size
对象,只需删除这些覆盖就可以避免此问题。