我正在使用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
和localdb.MyLTable
个对象的内容并确定没有重复项,并且我还将MyLTable的主键更改为自动增量值,这表明重复项不是被创造。
localdb
对象似乎保留了被其他进程删除的行,但是当我列出其中的所有行时,它们不会显示。
我可以通过在代码的调用之间断开连接并重新连接到数据库来解决问题,但这对我来说似乎不对。
处理此问题的推荐方法是什么?
答案 0 :(得分:0)
您的datacontext过时了。它应该是短暂的。
每次启动此过程时都应重新创建datacontext,然后在正确的路径之后进行处理。