我有一个发票数据库,其中包含一个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 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
阅读几条建议后,我决定在运行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
我尝试插入一些测试记录,它似乎正在工作,但我会在重新启动服务器时知道更多。