0

我正在使用 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_rowsandlocaldb.MyLTable对象的内容并确定没有重复项,并且我将 MyLTable 的主键更改为自动增量值,这表明没有创建重复项。

localdb对象似乎保留了其他进程删除的行,尽管当我列出其中的所有行时它们没有显示。

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

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

4

1 回答 1

0

您的数据上下文变得陈旧。它应该是短暂的。

您应该在每次启动此过程时重新创建数据上下文并立即处理它。

于 2013-06-18T17:28:34.037 回答