如何在Entity Framework中安全地增加计数器

Dej*_*jas 7 entity-framework entity-framework-4

假设我有一个跟踪文件下载次数的表,并通过EF将该表暴露给我的代码.下载文件时,我想将计数更新一次.起初,我写了这样的东西:

var fileRecord = (from r in context.Files where r.FileId == 3 select r).Single();
fileRecord.Count++;
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

但是当我检查这些语句生成的实际SQL时,我注意到增量不是发生在数据库端,而是发生在我的内存中.所以我的程序读取数据库中的计数器值(比如2003),执行计算(新值是2004),然后使用新的Count值2004显式更新行.显然,从并发角度来看,这是不安全的.

我希望查询最终看起来像:

UPDATE Files SET Count = Count + 1 WHERE FileId=3
Run Code Online (Sandbox Code Playgroud)

谁能建议我怎么做到这一点?我不想在读取之前锁定行,然后在更新之后解锁,因为我害怕阻止其他用户的读取(除非有人只为写入锁定行而不是块读取).

我还看了一下Entity SQL命令,但看起来Entity SQL不支持更新.

谢谢

Jes*_*cer 1

当然欢迎您使用 EF 调用存储过程。使用您显示的 SQL 编写存储过程,然后在映射到所述存储过程的 EF 模型中创建函数导入。