如何使用 Linq 增加 MSSQL 数据库中的字段值。由于不同客户端和线程同时递增,read-add-write 选项不适合。
根据评论的回复,我尝试这样做:
public static async Task IncrementDownloadCounterAsync(Int32 id)
{
using (LICENSE_RO3Entities db = new LICENSE_RO3Entities())
{
using (DbContextTransaction transaction = db.Database.BeginTransaction())
{
DB.Update update = await db.Updates.FindAsync(id);
if (update != null)
{
update.download_counter++;
}
await db.SaveChangesAsync();
transaction.Commit();
}
}
}
更新单个记录不需要事务:EF 知道如何将乐观锁定用于相同目的。
如果您使用 Code First,则可以使用
[ConcurrencyCheck]
. 在这种情况下,EF 将在每次更新记录时额外检查数据库中相应属性的值是否未更改。如果数据库支持数据类型或其等价物,也可以向模型添加一个用
[Timestamp]
type属性标记的属性。Timestamp 和 ConcurrencyCheck 的区别在于 ConcurrencyCheck 仅被检查,而 Timestamp 也会在记录发生更改时自动更新。byte[]
rowversion
在任何情况下,无论您选择两种方法中的哪一种,
DbUpdateConcurrencyException
如果有人在您保存数据库时更改了数据库中的值,您都会得到。之后,您可以尝试再次增加计数器。但最正常的方式当然是使用数据库的方式来完成。EF 不提供通过 Linq 执行此操作的方法 - 因此您必须使用 SQL 查询:
如果您想从 SQL 代码中分离出覆盖层,您可以将此查询作为方法添加到上下文中: