使用C#更新实体框架中的余额

时间:2018-04-18 21:34:30

标签: c# sql-server entity-framework

我有一个有余额的网站&我曾经使用存储过程进行更新:

UPDATE Account 
SET Balance = Balance + @Diff

它运行良好但是现在使用C#和Entity Framework,我只能通过设置金额(首先加载值)来更新值。

我可以在更新前加载值但是我不喜欢生成的SQL语句:

UPDATE Account 
SET Balance = 6.99

这很糟糕,因为如果在读取之后和更新之前更新了余额(从加载到保存可能是300毫秒),那么我将在此过程中更改余额。

在EF中并不真正推荐在事务中运行,因为它会导致死锁。

有没有办法用EF做到这一点,还是需要使用存储过程进行更新?

1 个答案:

答案 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();
    }
}