将标识列重置为0

时间:2015-02-10 11:56:19

标签: c# linq

开始我的数据库和我的程序的结构。

我有一个包含3个表的简单数据库。

  • 服务器
  • Ressources
  • Avg_ressources

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上使用命令时,它工作正常。

现在我的问题是:

我是否必须停止其他线程才能实际重置密钥?

1 个答案:

答案 0 :(得分:1)

所以我找到了解决问题的方法,甚至找到了错误的原因。

DataContext没有刷新,所以它仍然有旧的主键,因此使用重复键抛出错误。

为了解决这个问题,我添加了以下代码:

   db.GetType().InvokeMember(
   "ClearCache",
   BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
   null, db, null);

我只是从DataContext调用一个实习方法,并且已经完成了这个技巧。