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

C# Linq to SQL:无法连续插入比较相等的两个对象,c#,sql,linq-to-sql,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(

我有一个表大小,并且在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();
在第三次提交更改时,我收到一条消息InvalidOperationException

“无法添加已存在的实体。”

如果我重新运行程序,我可以再次添加前两个,但不能添加第三个。我不知道发生了什么事,有人能给我一个指针吗

如果我只重写Size.Equals或Size.GetHashCode,则不会出现此问题,但当我同时重写这两个代码时会出现此问题

Equals和GetHashCode重写如下(但实际上任何实现值语义的方法都会导致相同的行为):

你说:

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

如果您重载了这些属性,使具有相同属性的两个
大小
实体被视为相等,那么这将按预期工作;LINQtoSQL使用相等检查来确定两个对象是否引用同一条记录以保持同步


首先为什么要覆盖
Equals
GetHashCode
?如果您希望能够插入类似的
大小
对象,只需删除这些覆盖即可避免此问题。

好的,您能告诉我这是在哪里记录的吗?另外,您能解释一下为什么我可以插入第一个和第二个(已经是现有项的“副本”)吗?我重写Size.Equals是因为它在其他地方对我来说很方便,我重写Size.GetHashCode是因为我读过,最好同时重写这两个。我当然可以摆脱它,但我想了解到底发生了什么…@Ernest_Galbrun-也许你应该在你的问题中添加
Equals
GetHashCode
的实现。这可能有助于人们回答问题。另外,在第一个示例中,您没有设置直径的值。默认值是多少?还可以显示该类吗?数据库中的重复记录与重复对象之间存在差异。前两次插入是在数据库中插入不同的对象。第三个对象与第二个对象相同(因为
等于
覆盖),所以Linq to SQL将其视为已添加的实体。它关心的原因是对象跟踪功能。调用
InsertOnSubmit
时,它会开始跟踪需要稍后插入的对象,并且调用
InsertOnSubmit
两次对框架没有意义。要浏览MSDN文档,您可以从这里开始:
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;
}