PK约束,在EF和自动增量字段中插入

时间:2014-08-25 12:13:54

标签: c# sql-server entity-framework auto-increment

我的代码现在运行了大约一个星期,突然它在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管理器中的表 enter image description here

1 个答案:

答案 0 :(得分:1)

有时,出于某种意外原因,IDENTITY列的SEED可能会损坏。正如你所说它一直在工作并且你最近收到错误,我想这就是发生的事情(除非你改变了其他任何东西!)。

如果是这样,您应该尝试在数据库中运行它:

DBCC CHECKIDENT('SchemaName.TableName', NORESEED)

这将使当前种子(下一个生成的值是种子+ 1)

如果DB中存在下一个值,则必须使用此命令更改种子

DBCC CHECKIDENT('SchemaName.TableName', RESEED)

有关详细信息,请参阅:DBCC CHECKIDENT