我正在使用 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_rows
andlocaldb.MyLTable
对象的内容并确定没有重复项,并且我将 MyLTable 的主键更改为自动增量值,这表明没有创建重复项。
该localdb
对象似乎保留了其他进程删除的行,尽管当我列出其中的所有行时它们没有显示。
我可以通过在代码调用之间断开并重新连接到数据库来纠正问题,但这对我来说似乎不正确。
处理此问题的推荐方法是什么?