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

时间:2015-12-17 04:40:19

标签: c# entity-framework

我需要在用户提交网络表单时进行计数。当多个用户同时提交表单时,我遇到了并发问题。一些计数器值是相同的。怎么预防?

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();

3 个答案:

答案 0 :(得分:1)

您还可以向实体添加行版本字段,以使EF支持乐观并发:http://www.codeproject.com/Articles/817432/Optimistic-Concurrency-in-Entity-Framework-Code-Fi

如果并发更新,您可以捕获DbUpdateConcurrencyException,重新加载实体并再次递增计数器,如下所示:https://msdn.microsoft.com/en-us/data/jj592904.aspx

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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