【发布时间】:2017-01-27 18:41:43
【问题描述】:
我有一个客户已经运行我的程序几年了,他开始出现奇怪的错误。 我的应用程序在其中抛出异常:
Cannot insert duplicate key in object
由于我已经好几年没有接触过代码了,这让我很困惑。 而且只是偶尔发生。
经过大量调试并拔掉头发后,我弄清楚了发生了什么。
在将项目添加到数据库的代码中,我调用session.SaveOrUpdate。
我不记得我选择这个而不是预期的session.Save 方法的具体原因,但让我们继续。 (不过,我正在为客户的代码更改它)。
所以似乎正在发生的事情是SaveOrUpdate 正在重新使用现有对象的 ID 并完全覆盖现有项目。我的代码抛出错误,但新项目已保存到数据库中,并且不再有原始记录的痕迹。在我的 nhibernate 映射文档中,我使用 hilo 生成器作为对象 ID。
我猜这只是因为数据库中现在有足够的项目来使 ID 重新启动或其他什么,我不知道。我确实有一个审计表,其中有/有很多记录。 10,000 的。但是我截断了该表以使备份更小。 (这可能会导致这个问题)。
我正在尝试找出是否有人可以最终说明 SaveOrUpdate 是否出于某种原因重复使用现有 ID,或者为什么现在将调用更改为 Save 有效。如果这是一个已知问题,我会轻松入睡,如果不是,我需要进一步调试以查看是否仍然存在客户端丢失数据的情况。
我的代码正在运行 Nhibernate 3.3.3.4000,这是我编写此应用程序时的最新代码。
更新 1
Session.Save 也在重复使用 ID。
在插入新记录时,我不断收到重复键错误。但不是每次,只有几次。所以它非常随机,很难调试。
【问题讨论】:
标签: c# session nhibernate fluent-nhibernate