我的代码现在运行了大约一个星期,突然它在db.saveContext()
上给了我一个错误。它插入到表中,PK是一个启用了自动增量的标识字段。
现在我在代码中得到一个例外:
{"Violation of PRIMARY KEY constraint 'PK_Acks'. Cannot insert duplicate key in object 'dbo.Acks'. The duplicate key value is (12685028).\r\nThe statement has been terminated."}
这对我来说真的很奇怪,它会突然变成一个问题。
这是我的代码:
if (logBufferCounter++ > 1000)
{
logBufferCounter = 0;
db.SaveChanges();
recreateContext();
}
我也尝试删除1000批次更新以进行调试。仍然是同样的错误。我还删除了recreateContext()
但仍然出现了同样的错误。
此代码只有一个实例在运行。
可能是什么问题?好像我偶然发现了一些较低级别的错误。
以下是我创建对象的方法:
Ack tableItem = new Ack();
try
{
tableItem.messageId = logUtil.getMessageId(tmpPacket);
tableItem.serverId = logItem.serverId;
tableItem.time = logUtil.getTime(tmpPacket.getValueOfTag(tcp_packet.pck_tag_types.TM));
int mr = Convert.ToInt32(tmpPacket.getValueOfTag(tcp_packet.pck_tag_types.MR));
tableItem.direction = logUtil.getDirection(mr);
tableItem.isNack = !tmpPacket.is_ack();
tableItem.unitId = logUtil.getAckUnitId(tmpPacket);
// Calculate The Client Id
tcp_packet.pck_item cl;
if (tmpPacket.find(tcp_packet.pck_tag_types.CL, out cl))
{
tableItem.clientId = cl.value;
}
else
{
tableItem.clientId = null;
}
tableItem.data = tableItem.data.Substring(0, 50);
// Save to db
db.Acks.Add(tableItem);
}
catch (Exception e)
{
log.Error("Could not build tmpItem for an ack packet: " + logItem.payload, e);
}
我在sql server 2012中使用EF 6.1 Databse First。
您应该将自动增量键/值初始化为什么值?
[编辑] Ack模型类:
public partial class Ack
{
public long ackId { get; set; }
public long messageId { get; set; }
public byte serverId { get; set; }
public System.DateTime time { get; set; }
public bool direction { get; set; }
public bool isNack { get; set; }
public string unitId { get; set; }
public string clientId { get; set; }
public string data { get; set; }
public virtual Server Server { get; set; }
}
|这是sql管理器中的表
答案 0 :(得分:1)
有时,出于某种意外原因,IDENTITY列的SEED可能会损坏。正如你所说它一直在工作并且你最近收到错误,我想这就是发生的事情(除非你改变了其他任何东西!)。
如果是这样,您应该尝试在数据库中运行它:
DBCC CHECKIDENT('SchemaName.TableName', NORESEED)
这将使当前种子(下一个生成的值是种子+ 1)
如果DB中存在下一个值,则必须使用此命令更改种子
DBCC CHECKIDENT('SchemaName.TableName', RESEED)
有关详细信息,请参阅:DBCC CHECKIDENT。