由于自动生成的问题而替换了SQL Server IDENTITY

时间:2019-03-13 17:29:02

标签: sql-server identifier

我有一个发票数据库,其中包含一个ID IDENTITY,每次LINQ插入创建新记录时,SQL Server都会以一(+1)的增量自动生成ID。

我当前用来创建新记录的代码发布在下面,并且增量ID由SQL Server自动生成。

public async Task<IActionResult> Create([Bind(
                "PurchaseOrder,InvDate,DelDate,PaidDate,AgentName,FullName,FirstName, LastName,CustId,CompanyName,ClientRole,Email,Phone,Address," +
            "City,State,Zip,Country,ProdCode,Description,Quantity,UnitPrice,LineTotal,OrderTotal,Tax,Discount,Credit," +
            "Shipping,GrandTotal,Deposit,AmtDue,DiscAmt,Notes,Published,Year,Expenses,ProjectDescription,ClientProvision")]
            CreateNewOrderViewModel cnq)
        {
            int invId;

            try
            {
                await _context.AddAsync(cnq);
                await _context.SaveChangesAsync();
            }
            catch (InvalidCastException e)
            {
                ViewBag.Result = $"Database insert failed with: {e}";
                return View();
            }

        }

我的问题是SQL Server ID IDENTITY。每次重新启动服务器时,我的ID IDENTITY值将增加1000倍,而不是默认值1,例如,将我创建的下一条记录更改/增加1000倍。因此,如果我的上一条记录是1001,下一个创建的记录将是2001,而不是1002。每次更新服务器并需要重新启动时,此行为就会继续。我搜索了一个答案,发现问题是一个SQL Server错误,该错误基于可记住最新ID值的缓存协议。

由于我位于共享主机服务器上,并且无法完全控制数据库,因此我只有DBO可以访问自己的数据库。我想知道是否可以使用LINQ为新的InvID列生成增量值,然后将其用作记录ID,而不是SQL Server生成的值。

2 个答案:

答案 0 :(得分:0)

如果您无法控制数据库来处理sql server identity gap issue,则需要从表中手动读取最大的Id并将其递增1以获得新记录。 br /> 检索最后一个Id的示例代码:

int lastId = _context.TableA.OrderByDescending(t => t.Id).FirstOrDefault().Id;
int newId = lastId + 1;
// Add the new record with newId

答案 1 :(得分:0)

在阅读了一些建议后,我决定在运行LINQ查询之前检查并重新设置ID。

        using (var connection = new SqlConnection(_data.DATA))
        {
            connection.Open();

            try
            {
                var seed = new SqlCommand("CreateIDSeed", connection)
                {
                    CommandType = CommandType.StoredProcedure
                };
                seed.ExecuteNonQuery();

                await _context.AddAsync(cnq);
                await _context.SaveChangesAsync();
            }
            catch (InvalidCastException e)
            {
                ViewBag.Result = $"Database insert failed with: {e}";
                return View();
            }
        }

CreateIDSeed如下所示:

CREATE PROCEDURE [dbo].[CreateIDSeed] 
AS
BEGIN
    SET NOCOUNT ON;
        declare @newId int
        select @newId = max(ID) from dbo.CreateNewOrderViewModel
        DBCC CheckIdent('dbo.CreateNewOrderViewModel', RESEED, @newId)  
END
GO

我尝试插入一些测试记录,但似乎可以正常工作,但是重新启动服务器后,我会知道更多。