我有一个发票数据库,其中包含一个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生成的值。
答案 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
我尝试插入一些测试记录,但似乎可以正常工作,但是重新启动服务器后,我会知道更多。