来自Linq-to-SQL SubmitChanges的Spurious DuplicateKeyException

时间:2013-06-18 13:41:19

标签: c# linq-to-sql duplicates

我正在使用Linq-to-SQL将行从一个数据库移动到另一个数据库: -

remote_rows = (from a in remotedb.MyRTable
                   where a.Key1 >= some_value &&
                         a.Key2 >= some_other_value
                   select a).ToList();

local_rows = (from a in localdb.MyLTable
                  where a.Key1 >= some_value &&
                        a.Key2 >= some_other_value
                  select a).ToList();

new_rows = remote_rows.ConvertAll(new Converter<MyRTable, MyLTable>(MyRToMyL));
new_rows.RemoveAll(rrow => local_rows.Exists(lrow => rrow.Key1 == lrow.Key1 &&
                                                     rrow.Key2 == lrow.Key2));

if (new_rows.Count() > 0)
{
    localdb.MyLTable.InsertAllOnSubmit(new_rows);
    localdb.SubmitChanges();
}

此代码在循环中间隔调用,并且它可以正常工作,直到某个其他进程从localdb.MyLTable中删除行(在当前情况下,我使用SQL Server Management Studio执行此操作)。它尝试重新创建这些行(这是预期的行为),但结果始终是DuplicateKeyException

我检查了new_rowslocaldb.MyLTable个对象的内容并确定没有重复项,并且我还将MyLTable的主键更改为自动增量值,这表明重复项不是被创造。

localdb对象似乎保留了被其他进程删除的行,但是当我列出其中的所有行时,它们不会显示。

我可以通过在代码的调用之间断开连接并重新连接到数据库来解决问题,但这对我来说似乎不对。

处理此问题的推荐方法是什么?

1 个答案:

答案 0 :(得分:0)

您的datacontext过时了。它应该是短暂的。

每次启动此过程时都应重新创建datacontext,然后在正确的路径之后进行处理。