Linq to SQL:无法连续插入2个比较相等的对象

时间:2016-06-06 16:39:29

标签: c# sql linq-to-sql

我有一个表格大小,我在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;
}

1 个答案:

答案 0 :(得分:2)

你说:

  

我在Linq to SQL生成的相应对象上重载了GetHashCode和Equals。

如果你重载那些具有相同属性的两个Size实体被认为是相等的,那么这是按预期工作的; LINQ to SQL使用相等性检查来确定两个对象是否引用相同的记录以保持同步。

为什么首先覆盖EqualsGetHashCode?如果您希望能够插入类似的Size对象,只需删除这些覆盖就可以避免此问题。