C# 实体框架并发发布字段值根据现有值增加1

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

我需要计算用户提交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 = new TableA(){ OrgId = 1, counter = newCounter, createdDate = DateTime.Now, createdBy = username };
db.TableA.Add(newRecord);
db.SaveChanges();

您可以将所有表单提交记录为单独的记录,并在必要时将其聚合。它比线程同步容易得多,并且适用于多个IIS配置。

您需要使用更新表的代码,但这可能会导致性能问题


其他选项可能是您更改了架构,因此最终不需要将总计数保存在数据库中,但您可以使用计数方法(例如(聚合)进行计算。

您还可以向实体添加行版本字段,以使EF支持乐观并发:


在并发更新的情况下,您可以捕获DbUpdateConcurrencyException,重新加载实体并再次递增计数器,如图所示:

最后,我将计数器字段设置为主键,并尝试计算计数器值,并在DbUpdateException发生时再次插入。