我有一个有余额的网站&我曾经使用存储过程进行更新:
UPDATE Account
SET Balance = Balance + @Diff
它运行良好但是现在使用C#和Entity Framework,我只能通过设置金额(首先加载值)来更新值。
我可以在更新前加载值但是我不喜欢生成的SQL语句:
UPDATE Account
SET Balance = 6.99
这很糟糕,因为如果在读取之后和更新之前更新了余额(从加载到保存可能是300毫秒),那么我将在此过程中更改余额。
在EF中并不真正推荐在事务中运行,因为它会导致死锁。
有没有办法用EF做到这一点,还是需要使用存储过程进行更新?
答案 0 :(得分:2)
尝试使用ConcurrencyCheckAttribute
:
<强>型号:强>
public class Account
{
//other properties...
[ConcurrencyCheck]
public decimal Balance {get; set;}
}
余额更新逻辑:
while(true)
{
balance += diff;
try
{
context.SaveChanges();
break;
}
catch(DbUpdateConcurrencyException)
{
//balance was updated by someone else,
//so we will get it's last value and try to update again
context.Entity(balance).Reload();
}
}