C# Linq to SQL:无法连续插入比较相等的两个对象
我有一个表大小,并且在Linq to SQL生成的相应对象上重载了GetHashCode和Equals 我正在执行以下代码: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(
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;
}