Linq to sql 为什么在我检查密钥是否存在后,在Linq2Sql中会出现DuplicateKeyException?

Linq to sql 为什么在我检查密钥是否存在后,在Linq2Sql中会出现DuplicateKeyException?,linq-to-sql,Linq To Sql,我有一个使用Linq2SQL向数据库添加大量新数据的程序 为了避免DuplicateKeyExceptions,在尝试向数据库中添加新值之前,我检查该键是否存在 到目前为止,我还不能提供一个独立的测试用例,但我已经尽可能地简化了代码 // newValue is created outside of this function, with data read from a file // The code is supposed to either add new values to the d

我有一个使用Linq2SQL向数据库添加大量新数据的程序

为了避免DuplicateKeyExceptions,在尝试向数据库中添加新值之前,我检查该键是否存在

到目前为止,我还不能提供一个独立的测试用例,但我已经尽可能地简化了代码

// newValue is created outside of this function, with data read from a file
// The code is supposed to either add new values to the database, or update existing ones

var entryWithSamePrimaryKey = db.Values.FirstOrDefault(row => row.TimestampUtc == newValue.TimestampUtc && row.MeterID == newValue.MeterID);
if (entryWithSamePrimaryKey == null)
{
    db.Values.InsertOnSubmit(newValue);
    db.SubmitChanges();
}
else if(entryWithSamePrimaryKey.VALUE != newValue.VALUE)
{
    db.Values.DeleteOnSubmit(entryWithSamePrimaryKey);
    db.SubmitChanges();
    db.Values.InsertOnSubmit(newValue);
    db.SubmitChanges();
}
奇怪的是,当我查看应用程序日志中的异常(关于哪些项会导致问题)时,我在数据库中找不到任何异常

我怀疑这是在更新代码中发生的,因此这些项会从数据库中删除,但不会再次添加


我将更新我的代码以提供更多信息,然后相应地更新这篇文章。

如果在更新块中生成错误,您可以在更新案例中合并对象,而无需删除EntryWithAmePrimaryKey,但使用newValue的属性值对其进行赋值,然后保存更改。

我有一个正在运行的测试案例,这样的话,一次完整的跑步大约需要半天的时间。我只是觉得使用新实体比复制所有属性的值更干净。另外,我觉得这是一个错误的地方,和航运周围它不是正确的方式去。好的,但我不认为这是一个错误的变化处理器。尝试在删除之后和插入新值之前从ObjectContext中删除对象。i、 e.db.Values.RemoveentryWithSamePrimaryKey我没有添加/删除函数,只插入Submit和DeleteOnSubmit。我认为添加/删除功能现在已经被取消了。我将对此进行一些检查。结果表明,我能找到的解决此问题的最佳解决方案是,不要为每个项目“提交更改”,而是将它们缓存在列表中,以便能够比较重复项,然后刷新它们。