如何在Azure Sql数据库中无间隙地生成STRICTLY增加的数字

时间:2013-12-06 14:23:10

标签: sql-server entity-framework azure-sql-database

我有一个MVC 5应用程序,它通过Entity框架访问Sql数据库。我的发票模型如下:

class Invoice 
{
public int Id {get; set;}
public int InvoiceNumber {get; set;}
// other fields ....
}

InvoiceNumber有很多法律约束。它必须是唯一增量,没有间隙。我最初虽然我的Id会做这个工作,直到我发现由于某些原因我可能在id之间有间隙(1,2,3,...,7然后1000 ......,对于inst见{{3} })。 考虑到可以同时连接许多客户端,因此这些插入可能是并发的。

是否有人知道如何强制EF或数据库生成此类发票号。

2 个答案:

答案 0 :(得分:1)

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

INSERT INTO Invoice (InvoiceID)
OUTPUT inserted.InvoiceID
SELECT MAX(InvoiceID) + 1
FROM Invoice

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

我不知道在实体框架中这样做,因为我没有进行太多的应用程序开发,但是有可能实现这一点只需要花费更长的时间来手动而不是信任表设置。

我在这里假设你已经调查了另一个问题中提出的NOCACHE解决方案并发现了它的某些问题?

答案 1 :(得分:1)

旧问题,但您可以预先生成所有发票号的表格,并将其标记为已使用。然后查询最小的未标记值。

表格也不一定是所有数字,就像提前1000,或者其他任何方式一样。