【发布时间】:2014-08-06 20:05:28
【问题描述】:
有人要求我清理其他人的控制器代码,该代码会生成发票,但我遇到了一些我不知道如何解决的问题。有问题的代码如下(这是使用 EF 6: Code First):
var invid = db.TransportJobInvoice.Where(c => c.CompanyId == CompanyId)
.Max(i => i.InvoiceId);
var invoiceId = invid == null ? 1 : (int)invid + 1;
代码应该根据为其创建发票的公司生成invoiceId。所以这个小表可能如下所示:
------------------------------
| Id | CompanyId | InvoiceId |
------------------------------
| 1 | 1 | 1 |
------------------------------
| 2 | 1 | 2 |
------------------------------
| 3 | 1 | 3 |
------------------------------
| 4 | 2 | 1 |
------------------------------
| 5 | 2 | 2 |
------------------------------
如您所见,invoiceId 将根据相关公司的当前发票数量生成。但是,我认为建议两个线程可以在评估此行之前执行查询是合理的:
var invoiceId = invid == null ? 1 : (int)invid + 1;
这将导致为两张不同的发票生成相同的invoiceId。
是否有一个简单的解决方案,可能利用 Entity Framework 自动执行此操作?
【问题讨论】:
-
我删除了我的答案,因为我确实忽略了这一点。如果将 UPDATE 代码与增加发票 ID 的部分一起移动到存储过程,它将与事务一起使用。否则,恐怕你没有锁就无法逃脱。
-
@MarcelN。我非常感谢您的帮助。
标签: c# asp.net-mvc multithreading entity-framework