将身份列重置为 0

Reset identity Column to 0

首先是我的数据库结构和我的程序。

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

资源和 Avg_Ressources 包含来自服务器的外键。两者还包含一个主键。

我的程序每秒将 cpu 使用情况、内存使用情况和时间写入资源 table。写作部分在一个线程中(这背后的原因是我从多个服务器通过网络通过流获取信息)

在另一个线程中,我 运行 一个 class 具有将资源 table 中的数据分组并将它们插入 Avg_Usage table 的方法。到目前为止,一切都按预期工作。

下面是错误的部分。

将数据插入 table 后,我尝试使用

从旧的 table 中删除数据
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 服务器管理器直接在数据库上使用命令时,它工作正常。

现在我的问题是:

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

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

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

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

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

我只是从 DataContext 调用了一个实习生方法,这就成功了。