我有一个MVC 5应用程序,通过实体框架访问Sql数据库.我的发票模型如下:
class Invoice
{
public int Id {get; set;}
public int InvoiceNumber {get; set;}
// other fields ....
}
InvoiceNumber有很多法律约束.它需要是独一无二的,并且没有差距.我最初虽然我的Id会做这个工作,直到我发现由于某些原因我可能在id之间有间隙(1,2,3,…,7然后1000 ……,对于inst见Windows Azure SQL Database – Identity Auto increment column skips values).
考虑到可以同时连接许多客户端,因此这些插入可能是并发的.
有人知道如何强制EF或数据库生成此类发票号.
最佳答案 我认为你获得这个确切功能的唯一方法是删除标识,在列上添加唯一索引,然后设计一个非常轻量级的进程,发出对表的调用以插入下一个值,如
INSERT INTO Invoice (InvoiceID)
OUTPUT inserted.InvoiceID
SELECT MAX(InvoiceID) + 1
FROM Invoice
然后,您将回写包含整个值的更新,或者将其设置为一个完成的查询类型,您将该值作为一个事务写回一个语句,例如将所有预期的插入传递到要写入的过程中价值出来.
我不知道在实体框架中这样做,因为我没有做太多的应用程序开发,但是可以实现这一点只需要花费更长的时间来手动而不是信任表设置.
我在这里假设您已经调查了另一个问题中提出的NOCACHE解决方案并发现了一些问题吗?