如何在 Azure Sql 数据库中无间隙地生成严格递增的数字

Dav*_*ave 5 sql-server entity-framework azure-sql-database

我有一个 MVC 5 应用程序,它通过实体框架访问 Sql 数据库。我有一个发票模型,看起来像:

class Invoice 
{
public int Id {get; set;}
public int InvoiceNumber {get; set;}
// other fields ....
}
Run Code Online (Sandbox Code Playgroud)

InvoiceNumber 有很多法律约束。它需要是唯一的,并且是无间隙的增量。我最初认为我的 Id 可以完成这项工作,直到我发现由于某些原因我可能在 id 之间存在差距( 1,2,3,...,7 然后 1000 ... ,例如参见Windows Azure SQL 数据库- 身份自动递增列跳过值)。考虑到可以同时连接多个客户端,因此这些插入可能是并发的。

有人知道如何强制EF或数据库生成这种发票编号。

Dav*_*vid 1

我认为获得这个确切功能的唯一方法是删除标识,在列上添加唯一索引,然后设计一个非常轻量级的过程,该过程向表发出调用以插入下一个值,例如

INSERT INTO Invoice (InvoiceID)
OUTPUT inserted.InvoiceID
SELECT MAX(InvoiceID) + 1
FROM Invoice
Run Code Online (Sandbox Code Playgroud)

然后,您可以写回包含整个值的更新,或者将其设置为一次性完成类型的查询,在该查询中,您可以将值作为语句中的一个事务写回,例如当您将所有预期插入传递到过程中以写入时值出来。

我不知道如何在实体框架中执行此操作,因为我没有进行太多应用程序开发,但完成此操作可能需要更长的时间来手动完成,而不是信任表设置。

当然,我在这里假设您已经研究了另一个问题中提出的 NOCACHE 解决方案并发现了某种问题?