开始我的数据库和我的程序的结构。
我有一个包含3个表的简单数据库。
Ressources和Avg_Ressources包含来自Server的外键。两者都包括主键。
我的程序每秒都会将CPU使用率,内存使用情况和时间写入Ressources表。写作部分在一个线程中(背后的原因是我通过网络从多个服务器获取信息)
在另一个线程中,我运行一个类,其中包含从Ressources表中对数据进行分组的方法,并将它们插入到Avg_Usage表中。到目前为止,一切都按预期运作。
现在出现错误的部分。
在我将数据插入表格后,我尝试使用
删除旧表格中的数据db.ExecuteCommand("TRUNCATE TABLE Ressources")
在这种情况下,db是我的DataContext。来自Ressources的数据将被删除,但主键仍包含相同的值。在下一次插入时,程序将触发以下错误+ stacktrace
System.Data.Linq.DuplicateKeyException
System.Data.Linq.ChangeProcessor.PostProcessUpdates(List`1 insertedItems, List`1 deletedItems) at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
我已经尝试db.ExecuteCommand("DBCC CHECKIDENT (Ressources, RESEED, 0)");
但它也没有成功。 只是要注意我在尝试将数据插入Ressources之前尝试使用db.Refresh,但这并没有解决问题。当我通过sql server manager直接在db上使用命令时,它工作正常。
现在我的问题是:
我是否必须停止其他线程才能实际重置密钥?
答案 0 :(得分:1)
所以我找到了解决问题的方法,甚至找到了错误的原因。
DataContext没有刷新,所以它仍然有旧的主键,因此使用重复键抛出错误。
为了解决这个问题,我添加了以下代码:
db.GetType().InvokeMember(
"ClearCache",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, db, null);
我只是从DataContext调用一个实习方法,并且已经完成了这个技巧。