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

问题描述 投票:0回答:2

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

我目前用于创建新记录的代码将在下面发布,增量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生成的值。

sql-server identifier
2个回答
0
投票

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

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

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

我尝试插入一些测试记录,它似乎正在工作,但我会在重新启动服务器时知道更多。

© www.soinside.com 2019 - 2024. All rights reserved.