使用UpdateRange方法时处理并发异常

时间:2018-08-17 12:27:04

标签: asp.net entity-framework asp.net-core concurrency ef-core-2.0

首先,我从Database(Sql Server)获得了跟踪的项目列表。 我有一个方案来使用并发检查更新项目列表。 数据库中的每一行都有rowversion列,并使用流利的api IsRowversion()方法进行配置。

在为列表中的每个项目编辑了一些属性后,使用一个断点,我为sql server中的每一行手动更改了一列以引发异常。 但即使更改了多个记录,该异常也始终只有一个条目。 (Ef核心2.1)

public async Task UpdateWithConcurrency<T>(List<T> items, CancellationToken ct) where T : class, new()
    {
        foreach (var item in items)
            item.GetType().GetProperty("DateModified").SetValue(item, DateTime.Now);

        List<T> databaseEntries = new List<T>();
        _context.UpdateRange(items);
        try
        {
            await _context.SaveChangesAsync(ct);
        }
        catch (DbUpdateConcurrencyException ex)
        {
            var errors = ex.Entries; // ==> The count is always one even 
            // even with changes in each row

            foreach (var errorEntry in errors)
            {
                var databaseItem = await errorEntry.GetDatabaseValuesAsync();
                databaseEntries.Add(databaseItem.ToObject() as T);
            }

        }
    }

1 个答案:

答案 0 :(得分:0)

  

即使更改了多个记录,该异常也始终只有一个条目。 (Ef核心2.1)

SaveChanges()在事务中运行,但是一次应用更改。发生第一个并发错误后,EF不会继续尝试保存更改。