C# 实体框架并发发布字段值根据现有值增加1
我需要计算用户提交web表单的时间。当多个用户同时提交表单时,我遇到了一个并发问题。有些计数器值是相同的。如何预防C# 实体框架并发发布字段值根据现有值增加1,c#,entity-framework,C#,Entity Framework,我需要计算用户提交web表单的时间。当多个用户同时提交表单时,我遇到了一个并发问题。有些计数器值是相同的。如何预防 var db = new MyDB(); var maxCounter = db.TableA.Where(x=>x.OrgId == 1).Max(x=>x.counter); int newCounter = 0; if(maxCounter != null) { newCounter = maxCounter +1; } var newRecord
var db = new MyDB();
var maxCounter = db.TableA.Where(x=>x.OrgId == 1).Max(x=>x.counter);
int newCounter = 0;
if(maxCounter != null)
{
newCounter = maxCounter +1;
}
var newRecord = new TableA(){ OrgId = 1, counter = newCounter, createdDate = DateTime.Now, createdBy = username };
db.TableA.Add(newRecord);
db.SaveChanges();
您可以将所有表单提交记录为单独的记录,并在必要时将其聚合。它比线程同步容易得多,并且适用于多个IIS配置。您需要使用更新表的代码,但这可能会导致性能问题
其他选项可能是您更改了架构,因此最终不需要将总计数保存在数据库中,但您可以使用计数方法(例如(聚合)进行计算。您还可以向实体添加行版本字段,以使EF支持乐观并发:
在并发更新的情况下,您可以捕获DbUpdateConcurrencyException,重新加载实体并再次递增计数器,如图所示:最后,我将计数器字段设置为主键,并尝试计算计数器值,并在DbUpdateException发生时再次插入。