保存数据时出现DbUpdateConcurrencyException

时间:2017-05-18 13:31:17

标签: c# entity-framework

我正在使用实体框架,当我调用context.entities方法时,即使数据库具有新值,它也会给我旧值。

例如,我有列状态,它由控制台应用程序更新为9(其他应用程序但使用相同的方法更新),当我调用context.entities时,它给出0,这是更新操作之前的值。

我想要强调的一件事是,当控制台应用程序更新记录时,它会抛出DbUpdateConcurrencyException。该方法通过以下代码处理该异常。

public async System.Threading.Tasks.Task<int> SaveChanges()
{
    int count = 0;
    bool saveFailed;

    do
    {
        saveFailed = false;
        try
        {
            count = await this.context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            saveFailed = true;
            // Update original values from the database 
            var entry = ex.Entries.Single();
            entry.OriginalValues.SetValues(entry.GetDatabaseValues());
        }
    }
    while (saveFailed);

    return count;
}

//update code
Task.Run(async () =>
{
    while (true)
    {
        var timeNow = DateTime.Now;
        var entities = repo.All()
                            .Where(p => p.CreatedAt.HasValue &&
                                        p.Status == Infrastructure.Enum.Status.New || 
                                        p.Status == Infrastructure.Enum.Status.Pending)
                            .ToList()
                            .Where(p => timeNow.Subtract(p.CreatedAt.Value.DateTime) >= TimeSpan.FromSeconds(15));
        foreach (var item in entities)
        {
            //update
            item.Status= Status.Cancelled;
        }

        await repo.SaveChanges();
        await Task.Delay(1000);
    }
}).Wait();

1 个答案:

答案 0 :(得分:0)

我通过使用AsNoTracking()来修复它,因为在获取列表时它首次缓存数据并且在所有后续请求之后返回相同的数据。 -